ZGlmZiAtLWdpdCBhL2xpYl9pMzg2L01ha2VmaWxlIGIvbGliX2kzODYvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ5OTRlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYl9pMzg2L01ha2VmaWxlCkBAIC0wLDAgKzEsNDUgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAyCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSBsaWIkKEFSQ0gpLmEKKworQU9CSlMJPSBiaW9zLm8gcmVhbG1vZGVfc3dpdGNoLm8gaWMvc2M1MjBfYXNtLm8KKworQ09CSlMJPSBib2FyZC5vIGJpb3Nfc2V0dXAubyBpMzg2X2xpbnV4Lm8gemltYWdlLm8gcmVhbG1vZGUubyBcCisJICBwY2lfdHlwZTEubyBpYy9zYzUyMC5vIGljL2FsaTUxMngubworCitPQkpTCT0gJChBT0JKUykgJChDT0JKUykKKworJChMSUIpOgkuZGVwZW5kICQoT0JKUykKKwkkKEFSKSBjcnYgJEAgJChPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy5kZXBlbmQ6CU1ha2VmaWxlICQoQU9CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCisJCSQoQ0MpIC1NICQoQ0ZMQUdTKSAkKEFPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKSA+ICRACisKK3NpbmNsdWRlIC5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvbGliX2kzODYvYmlvcy5TIGIvbGliX2kzODYvYmlvcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNWVhOGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJfaTM4Ni9iaW9zLlMKQEAgLTAsMCArMSw0NDMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQorICogCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogQmFzZWQgb24gbXNiaW9zLmMgZnJvbSByb2xvIDEuNjoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zIEdtYkgKKyAqIEtsZWluLVdpbnRlcm5oZWltLCBHZXJtYW55CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKgorICogRHVyaW5nIGl0J3MgaW5pdGlhbGl6YXRpb24gcGhhc2UsIGJlZm9yZSBzd2l0Y2hpbmcgdG8gcHJvdGVjdGVkCisgKiBtb2RlLCB0aGUgTGludXggS2VybmVsIG1ha2VzIGEgZmV3IEJJT1MgY2FsbHMuIFRoaXMgd29uJ3Qgd29yaworICogaWYgdGhlIGJvYXJkIGRvZXMgbm90IGhhdmUgYSBCSU9TLgorICoKKyAqIFRoaXMgaXMgYSB2ZXJ5IG1pbmltYWxpc2ljIEJJT1MgdGhhdCBzdXBwbGllcyBqdXN0IGVub3VnaAorICogZnVuY3Rpb25hbGl0eSB0byBrZWVwIHRoZSBMaW51eCBLZXJuZWwgaGFwcHkuIEl0IGlzIE5PVAorICogYSBnZW5lcmFsIHB1cnBvc2UgcmVwbGFjZW1lbnQgZm9yIGEgcmVhbCBCSU9TICEhCisgKi8KKworI2RlZmluZSBPRkZTX0VTICAgICAgMAorI2RlZmluZSBPRkZTX0dTICAgICAgMgorI2RlZmluZSBPRkZTX0RTICAgICAgNAorI2RlZmluZSBPRkZTX0RJICAgICAgNgorI2RlZmluZSBPRkZTX1NJICAgICAgOAorI2RlZmluZSBPRkZTX0JQICAgICAgMTAKKyNkZWZpbmUgT0ZGU19TUCAgICAgIDEyCisjZGVmaW5lIE9GRlNfQlggICAgICAxNAorI2RlZmluZSBPRkZTX0RYICAgICAgMTYKKyNkZWZpbmUgT0ZGU19DWCAgICAgIDE4CisjZGVmaW5lIE9GRlNfQVggICAgICAyMAorI2RlZmluZSBPRkZTX1ZFQ1RPUiAgMjIKKyNkZWZpbmUgT0ZGU19JUCAgICAgIDI0CisjZGVmaW5lIE9GRlNfQ1MgICAgICAyNgorI2RlZmluZSBPRkZTX0ZMQUdTICAgMjgKKworI2RlZmluZSBTRUdNRU5UICAgICAgMHg0MAorI2RlZmluZSBTVEFDSwkgICAgIDB4ODAwICAJCQkvKiBzdGFjayBhdCAweDQwOjB4ODAwIC0+IDB4ODAwICovCisKKy5zZWN0aW9uIC5iaW9zLCAiYXgiCisuY29kZTE2Cisub3JnIDAKKworLmdsb2JsIHJtX2ludDAwCitybV9pbnQwMDoKKwlwdXNodwkkMAorCWptcAlhbnlfaW50ZXJydXB0MTYKKy5nbG9ibCBybV9pbnQwMQorcm1faW50MDE6CisJcHVzaHcJJDEKKwlqbXAJYW55X2ludGVycnVwdDE2CisuZ2xvYmwgcm1faW50MDIKK3JtX2ludDAyOgorCXB1c2h3CSQyCisJam1wCWFueV9pbnRlcnJ1cHQxNgorLmdsb2JsIHJtX2ludDAzCitybV9pbnQwMzoKKwlwdXNodwkkMworCWptcAlhbnlfaW50ZXJydXB0MTYKKy5nbG9ibCBybV9pbnQwNAorcm1faW50MDQ6CisJcHVzaHcJJDQKKwlqbXAJYW55X2ludGVycnVwdDE2CisuZ2xvYmwgcm1faW50MDUKK3JtX2ludDA1OgorCXB1c2h3CSQ1CisJam1wCWFueV9pbnRlcnJ1cHQxNgorLmdsb2JsIHJtX2ludDA2CitybV9pbnQwNjoKKwlwdXNodwkkNgorCWptcAlhbnlfaW50ZXJydXB0MTYKKy5nbG9ibCBybV9pbnQwNworcm1faW50MDc6CisJcHVzaHcJJDcKKwlqbXAJYW55X2ludGVycnVwdDE2CisuZ2xvYmwgcm1faW50MDgKK3JtX2ludDA4OgorCXB1c2h3CSQ4CisJam1wCWFueV9pbnRlcnJ1cHQxNgorLmdsb2JsIHJtX2ludDA5CitybV9pbnQwOToKKwlwdXNodwkkOQorCWptcAlhbnlfaW50ZXJydXB0MTYKKy5nbG9ibCBybV9pbnQwYQorcm1faW50MGE6CisJcHVzaHcJJDEwCisJam1wCWFueV9pbnRlcnJ1cHQxNgorLmdsb2JsIHJtX2ludDBiCitybV9pbnQwYjoKKwlwdXNodwkkMTEKKwlqbXAJYW55X2ludGVycnVwdDE2CisuZ2xvYmwgcm1faW50MGMKK3JtX2ludDBjOgorCXB1c2h3CSQxMgorCWptcAlhbnlfaW50ZXJydXB0MTYKKy5nbG9ibCBybV9pbnQwZAorcm1faW50MGQ6CisJcHVzaHcJJDEzCisJam1wCWFueV9pbnRlcnJ1cHQxNgorLmdsb2JsIHJtX2ludDBlCitybV9pbnQwZToKKwlwdXNodwkkMTQKKwlqbXAJYW55X2ludGVycnVwdDE2CisuZ2xvYmwgcm1faW50MGYKK3JtX2ludDBmOgorCXB1c2h3CSQxNQorCWptcAlhbnlfaW50ZXJydXB0MTYKKy5nbG9ibCBybV9pbnQxMAorcm1faW50MTA6CisJcHVzaHcJJDE2CisJam1wCWFueV9pbnRlcnJ1cHQxNgorLmdsb2JsIHJtX2ludDExCitybV9pbnQxMToKKwlwdXNodwkkMTcKKwlqbXAJYW55X2ludGVycnVwdDE2CisuZ2xvYmwgcm1faW50MTIKK3JtX2ludDEyOgorCXB1c2h3CSQxOAorCWptcAlhbnlfaW50ZXJydXB0MTYKKy5nbG9ibCBybV9pbnQxMworcm1faW50MTM6CisJcHVzaHcJJDE5CisJam1wCWFueV9pbnRlcnJ1cHQxNgorLmdsb2JsIHJtX2ludDE0CitybV9pbnQxNDoKKwlwdXNodwkkMjAKKwlqbXAJYW55X2ludGVycnVwdDE2CisuZ2xvYmwgcm1faW50MTUKK3JtX2ludDE1OgorCXB1c2h3CSQyMQorCWptcAlhbnlfaW50ZXJydXB0MTYKKy5nbG9ibCBybV9pbnQxNgorcm1faW50MTY6CisJcHVzaHcJJDIyCisJam1wCWFueV9pbnRlcnJ1cHQxNgorLmdsb2JsIHJtX2ludDE3CitybV9pbnQxNzoKKwlwdXNodwkkMjMKKwlqbXAJYW55X2ludGVycnVwdDE2CisuZ2xvYmwgcm1faW50MTgKK3JtX2ludDE4OgorCXB1c2h3CSQyNAorCWptcAlhbnlfaW50ZXJydXB0MTYKKy5nbG9ibCBybV9pbnQxOQorcm1faW50MTk6CisJcHVzaHcJJDI1CisJam1wCWFueV9pbnRlcnJ1cHQxNgorLmdsb2JsIHJtX2ludDFhCitybV9pbnQxYToKKwlwdXNodwkkMjYKKwlqbXAJYW55X2ludGVycnVwdDE2CisuZ2xvYmwgcm1faW50MWIKK3JtX2ludDFiOgorCXB1c2h3CSQyNworCWptcAlhbnlfaW50ZXJydXB0MTYKKy5nbG9ibCBybV9pbnQxYworcm1faW50MWM6CisJcHVzaHcJJDI4CisJam1wCWFueV9pbnRlcnJ1cHQxNgorLmdsb2JsIHJtX2ludDFkCitybV9pbnQxZDoKKwlwdXNodwkkMjkKKwlqbXAJYW55X2ludGVycnVwdDE2CisuZ2xvYmwgcm1faW50MWUKK3JtX2ludDFlOgorCXB1c2h3CSQzMAorCWptcAlhbnlfaW50ZXJydXB0MTYKKy5nbG9ibCBybV9pbnQxZgorcm1faW50MWY6CisJcHVzaHcJJDMxCisJam1wCWFueV9pbnRlcnJ1cHQxNgorLmdsb2JsIHJtX2RlZl9pbnQKK3JtX2RlZl9pbnQ6CisJaXJldAorCisgCisJLyoKKwkgKiBBbGwgaW50ZXJydXB0IGp1bXB0YWJsZSBlbnRyaWVzIGp1bXAgdG8gaGVyZQorCSAqIGFmdGVyIHB1c2hpbmcgdGhlIGludGVycnVwdCB2ZWN0b3IgbnVtYmVyIG9udG8gdGhlCisJICogc3RhY2suCisJICovCithbnlfaW50ZXJydXB0MTY6CisJcHVzaGEJCQkJCS8qIHNhdmUgZ2VuZXJhbCByZWdpc3RlcnMgKi8KKwlwdXNodwklZHMJCQkJLyogc2F2ZSBzb21lIHNlZ21lbnRzICAgICAqLworCXB1c2h3CSVncworCXB1c2h3CSVlcworCXB1c2h3CSVzcwkJCQkvKiBzYXZlIGNhbGxlcnMgc3RhY2sgc2VnbWVudCAuLiAqLworCXBvcHcJJWdzCQkJCS8qIC4uLiBpbiBncyAqLworCW1vdncJJFNFR01FTlQsJWF4CQkJLyogc2V0dXAgbXkgc2VnbWVudHMgKi8KKwltb3Z3CSVheCwlZHMKKwltb3Z3CSVheCwlZXMKKwltb3Z3CSVheCwlc3MKKwltb3Z3CSVzcCwlYnAKKwltb3Z3CSRTVEFDSywlc3AJCQkvKiBzZXR1cCBCSU9TIHN0YWNrcG9pbnRlciAqLworCitncwltb3Z3CU9GRlNfVkVDVE9SKCVicCksICVheAorCWNtcHcJJDB4MTAsICVheAorCWplCUxpbnRfMTBoICAgICAgICAgCisJY21wdwkkMHgxMSwgJWF4CisJamUJTGludF8xMWgKKwljbXB3CSQweDEzLCAlYXgKKwlqZQlMaW50XzEzaAorCWNtcHcJJDB4MTUsICVheAorCWplCUxpbnRfMTVoCisJY21wdwkkMHgxNiwgJWF4CisJamUJTGludF8xNmgKKwltb3Z3CSQweGZmZmYsICVheAorCWptcAlMb3V0CitMaW50XzEwaDoJCQkJCS8qIFZHQSBCSU9TIHNlcnZpY2VzICovCisJY2FsbAliaW9zXzEwaAorCWptcAlMb3V0CitMaW50XzExaDoJCisJY2FsbAliaW9zXzExaAorCWptcAlMb3V0CitMaW50XzEzaDoJCQkJCS8qIEJJT1MgZGlzayBzZXJ2aWNlcyAqLworCWNhbGwJYmlvc18xM2gKKwlqbXAJTG91dAorTGludF8xNWg6CQkJCQkvKiBNaXNjLiBCSU9TIHNlcnZpY2VzICovCisJY2FsbAliaW9zXzE1aAorCWptcAlMb3V0CitMaW50XzE2aDoJCQkJCS8qIGtleWJvYXJkIHNlcnZpY2VzICovCisJY2FsbAliaW9zXzE2aAorCWptcAlMb3V0CitMb3V0OgkKKwljbXB3CSQwLCAlYXgKKwlqZQlMaGFuZGVsZWQKKwkKKwkvKiBJbnNlcnQgY29kZSBmb3IgdW5oYW5kZWxlZCBJTlRzIGhlcmUuCisJICoKKwkgKiBST0xPIHByaW50cyBhIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUgCisJICogKHdlIGNvdWxkIGRvIHRoYXQgYnV0IHRoZW4gd2UncmUgaW4gMTZiaXQgbW9kZQorCSAqIHNvIHdlJ2xsIGhhdmUgdG8gZ2V0IGJhY2sgaW50byAzMmJpdCBtb2RlCisJICogdG8gdXNlIHRoZSBjb25zb2xlIEkvTyByb3V0aW5lcyAoaWYgd2UgZG8gdGhpcworCSAqIHdlIHNodWxzIG1ha2UgaW50IDB4MTAgYW5kIGludCAweDE2IHdvcmsgYXMgd2VsbCkpCisJICovCitMaGFuZGVsZWQ6CisKKwlwdXNodwklZ3MJCQkJLyogcmVzdG9yZSBjYWxsZXJzIHN0YWNrIHNlZ21lbnQgKi8KKwlwb3B3CSVzcworCW1vdncJJWJwLCVzcAkJCQkvKiByZXN0b3JlIHN0YWNrcG9pbnRlciAqLworCisJcG9wdwklZXMJCQkJLyogcmVzdG9yZSBzZWdtZW50IHNlbGVjdG9ycyAqLworCXBvcHcJJWdzCisJcG9wdwklZHMKKwkKKwlwb3BhCQkJCQkvKiByZXN0b3JlIEdQIHJlZ2lzdGVycyAqLworCWFkZHcJJDIsJXNwCQkJCS8qIGR1bXAgdmVjdG9yIG51bWJlciAqLworCWlyZXQJCQkJCS8qIHJldHVybiBmcm9tIGludGVycnVwdCAqLworCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBCSU9TIAlpbnRlcnJ1cHQgMTBoIC0tIFZHQSBzZXJ2aWNlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitiaW9zXzEwaDoKK2dzCW1vdncJT0ZGU19BWCglYnApLCAlYXgKKwlzaHJ3CSQ4LCAlYXgKKwljbXB3CSQweDMsICVheAorCWplCUxjdXJfcG9zCisJY21wdwkkMHhmLCAlYXgKKwlqZQlMdmlkX3N0YXRlCisJY21wdwkkMHgxMiwgJWF4CisJamUJTHZpZF9jZmcKKwltb3Z3CSQweGZmZmYsICVheAorCXJldAorTGN1cl9wb3M6CQkJCQkvKiBSZWFkIEN1cnNvciBQb3NpdGlvbiBhbmQgU2l6ZSAqLworZ3MJbW92dwkkMCwgT0ZGU19DWCglYnApCitncwltb3Z3CSQwLCBPRkZTX0RYKCVicCkKKwl4b3J3CSVheCwgJWF4CisJcmV0CitMdmlkX3N0YXRlOgkJCQkJLyogR2V0IFZpZGVvIFN0YXRlICovCitncwltb3Z3CSQoODAgPDwgOHwweDAzKSwgT0ZGU19BWCglYnApCS8qIDgwIGNvbHVtbnMsIDgweDI1LCAxNiBjb2xvcnMgKi8KK2dzCW1vdncJJDAsIE9GRlNfQlgoJWJwKQorCXhvcncJJWF4LCAlYXgKKwlyZXQKK0x2aWRfY2ZnOgkvKiBWaWRlbyBTdWJzeXN0ZW0gQ29uZmlndXJhdGlvbiAoRUdBL1ZHQSkgKi8KK2dzCW1vdncJJDB4MTAsIE9GRlNfQlgoJWJwKQkJLyogaW5kaWNhdGUgQ0dBL01EQS9IR0EgKi8KKwl4b3J3CSVheCwgJWF4CisJcmV0CisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEJJT1MgaW50ZXJydXB0IDExaCAtLSBFcXVpcG1lbnQgZGV0ZXJtaW5hdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK2Jpb3NfMTFoOgorCW1vdncJYmlvc19lcXVpcG1lbnQsICVheAorZ3MJbW92dwklYXgsIE9GRlNfQVgoJWJwKSAgCisJeG9ydwklYXgsICVheAorCXJldAorCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBCSU9TIGludGVycnVwdCAxM2ggLS0gRGlzayBzZXJ2aWNlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitiaW9zXzEzaDoKK2dzCW1vdncJT0ZGU19BWCglYnApLCAlYXgKKwlzaHJ3CSQ4LCAlYXgKKwljbXB3CSQweDE1LCAlYXgKKwlqZQlMZnVuY18xNWgKKwltb3Z3CSQweGZmZmYsICVheAorCXJldAorTGZ1bmNfMTVoOgkKK2dzCW1vdncJT0ZGU19BWCglYnApLCAlYXgKKwlhbmR3CSQweGZmLCAlYXgJCQkvKiByZXR1cm4gQUg9MC0+ZHJpdmUgbm90IHByZXNlbnQgKi8KK2dzCW1vdncJJWF4LCBPRkZTX0FYKCVicCkKKwl4b3J3CSVheCwgJWF4CisJcmV0CisJCisJCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEJJT1MgaW50ZXJydXB0IDE1aCAtLSBNaXNjZWxsYW5lb3VzIHNlcnZpY2VzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYmlvc18xNWg6Citncwltb3Z3CU9GRlNfQVgoJWJwKSwgJWF4CisJc2hydwkkOCwgJWF4CisJY21wdwkkMHhjMCwgJWF4CisJamUJTGZ1bmNfYzBoCisJY21wdwkkMHhlOCwgJWF4CisJamUJTGZ1bmNfZThoCisJY21wdwkkMHg4OCwgJWF4CisJamUJTGZ1bmNfODhoCisJbW92dwkkMHhmZmZmLCAlYXgKKwlyZXQKKworTGZ1bmNfYzBoOiAJCQkJCS8qIFJldHVybiBTeXN0ZW0gQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXJzIChQUzIgb25seSkgKi8KK2dzCW1vdncJT0ZGU19GTEFHUyglYnApLCAlYXgKKwlvcncJJDEsICVheAkJCQkvKiByZXR1cm4gY2FycnkgLS0gZnVuY3Rpb24gbm90IHN1cHBvcnRlZCAqLworZ3MJbW92dwklYXgsIE9GRlNfRkxBR1MoJWJwKQorCXhvcncJJWF4LCAlYXgKKwlyZXQKKwkKK0xmdW5jX2U4aDoKK2dzCW1vdncJT0ZGU19BWCglYnApLCAlYXgKKwlhbmR3CSQweGZmLCAlYXgKKwljbXB3CSQxLCAlYXgKKwlqZQlMZnVuY19lODAxaAorZ3MJbW92dwlPRkZTX0ZMQUdTKCVicCksICVheAorCW9ydwkkMSwgJWF4CQkJCS8qIHJldHVybiBjYXJyeSAtLSBmdW5jdGlvbiBub3Qgc3VwcG9ydGVkICovCitncwltb3Z3CSVheCwgT0ZGU19GTEFHUyglYnApCisJeG9ydwklYXgsICVheAorCXJldAorCQorTGZ1bmNfZTgwMWg6CQkJCQkvKiBHZXQgbWVtb3J5IHNpemUgZm9yID42NE0gQ29uZmlndXJhdGlvbnMgKi8KKwltb3Z3CSRyYW1faW5fNjRrYl9jaHVua3MsICVheAorCWNtcHcJJDI1NiwgJWF4CisJamEJTG1vcmVfdGhhbl8xNm1iCisJc2hsdwkkNiwgJWF4CQkJCS8qIG11bHRpcGx5IGJ5IDY0ICovCQorZ3MJbW92dwklYXgsIE9GRlNfQVgoJWJwKSAgIAkJLyogcmV0dXJuIG1lbW9yeSBzaXplIGluIDFrYiBjaHVua3MgaW4gQVggYW5kIENYICovCitncwltb3Z3CSVheCwgT0ZGU19DWCglYnApCisJeG9ydwklYXgsICVheAorZ3MJbW92dwklYXgsIE9GRlNfQlgoJWJwKQkJLyogc2V0IEJYIGFuZCBEWCB0byAwKi8KK2dzCW1vdncJJWF4LCBPRkZTX0RYKCVicCkJCitncwltb3Z3CU9GRlNfRkxBR1MoJWJwKSwgJWF4CisJYW5kdwkkMHhmZmZlLCAlYXgJCQkvKiBjbGVhciBjYXJyeSAtLSBmdW5jdGlvbiBzdWNjZWVkZWQgKi8KK2dzCW1vdncJJWF4LCBPRkZTX0ZMQUdTKCVicCkKKwl4b3J3CSVheCwgJWF4CisJcmV0CisJCitMbW9yZV90aGFuXzE2bWI6CisJc3VidwkkMHgxMDAsICVheAkJCS8qIHN1YnRyYWN0IDE2TUIgKi8JCisJCitncwltb3Z3CSQweDNjMDAsIE9GRlNfQVgoJWJwKQkJLyogcmV0dXJuIDB4M2MwMCAoMTZNQi0zODRrKSBpbiBBWCBhbmQgQ1ggKi8KK2dzCW1vdncJJDB4M2MwMCwgT0ZGU19DWCglYnApCitncwltb3Z3CSVheCwgT0ZGU19CWCglYnApCQkvKiBzZXQgQlggYW5kIERYIHRvIG51bWJlciBvZiA2NGtiIGNodW5rcyAtIDI1NiAqLworZ3MJbW92dwklYXgsIE9GRlNfRFgoJWJwKQkKKworZ3MJbW92dwlPRkZTX0ZMQUdTKCVicCksICVheAorCWFuZHcJJDB4ZmZmZSwgJWF4CQkJLyogY2xlYXIgY2FycnkgLS0gZnVuY3Rpb24gc3VjY2VlZGVkICovCitncwltb3Z3CSVheCwgT0ZGU19GTEFHUyglYnApCisJeG9ydwklYXgsICVheAorCXJldAorCitMZnVuY184OGg6CisJbW92dwlyYW1faW5fNjRrYl9jaHVua3MsICVheAorCXN1YncJJDE2LCAlYXgKKwlzaGx3CSQ2LCAlYXgKKwkKK2dzCW1vdncJJWF4LCBPRkZTX0FYKCVicCkJCS8qIHJldHVybiBudW1iZXIgb2Yga2lsb2J5dGVzIGluIGF4ICovCisKK2dzCW1vdncJT0ZGU19GTEFHUyglYnApLCAlYXgKKwlhbmR3CSQweGZmZmUsICVheAkJCS8qIGNsZWFyIGNhcnJ5IC0tIGZ1bmN0aW9uIHN1Y2NlZWRlZCAqLworZ3MJbW92dwklYXgsIE9GRlNfRkxBR1MoJWJwKQorCisJeG9ydwklYXgsICVheAorCXJldAorCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBCSU9TIGludGVycnVwdCAxNmggLS0ga2V5Ym9hcmQgc2VydmljZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYmlvc18xNmg6Citncwltb3Z3CU9GRlNfQVgoJWJwKSwgJWF4CisJc2hydwkkOCwgJWF4CisJY21wdwkkMHgwMywgJWF4CisJamUJTGZ1bmNfMDNoCisJbW92dwkkMHhmZmZmLCAlYXgKKwlyZXQKK0xmdW5jXzAzaDoKKwl4b3J3CSVheCwgJWF4CQkJLyogZG8gbm90aGluZyAtLSBmdW5jdGlvbiBub3Qgc3VwcG9ydGVkICovCisJcmV0CisKKworLmdsb2JsIHJhbV9pbl82NGtiX2NodW5rcworcmFtX2luXzY0a2JfY2h1bmtzOgorCS53b3JkIAkwCisKKy5nbG9ibCBiaW9zX2VxdWlwbWVudAorYmlvc19lcXVpcG1lbnQ6CisJLndvcmQgCTAKKwpkaWZmIC0tZ2l0IGEvbGliX2kzODYvYmlvc19zZXR1cC5jIGIvbGliX2kzODYvYmlvc19zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MzE5YWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJfaTM4Ni9iaW9zX3NldHVwLmMKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQorICogCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisKKy8qCisgKiBQYXJ0bHkgYmFzZWQgb24gbXNiaW9zLmMgZnJvbSByb2xvIDEuNjoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zIEdtYkgKKyAqIEtsZWluLVdpbnRlcm5oZWltLCBHZXJtYW55CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL3JlYWxtb2RlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgTlVNVkVDVFMJMjU2CisKKyNkZWZpbmUgQklPU19EQVRBICAgICAgICAoKGNoYXIqKTB4NDAwKQorI2RlZmluZSBCSU9TX0RBVEFfU0laRSAgIDI1NgorI2RlZmluZSBCSU9TX0JBU0UgICAgICAgICgoY2hhciopMHhmMDAwMCkKKyNkZWZpbmUgQklPU19DUyAgICAgICAgICAweGYwMDAKKworZXh0ZXJuIHUxNiByYW1faW5fNjRrYl9jaHVua3M7CitleHRlcm4gdTE2IGJpb3NfZXF1aXBtZW50OworZXh0ZXJuIHZvaWQgKnJtX2ludDAwOworZXh0ZXJuIHZvaWQgKnJtX2ludDAxOworZXh0ZXJuIHZvaWQgKnJtX2ludDAyOworZXh0ZXJuIHZvaWQgKnJtX2ludDAzOworZXh0ZXJuIHZvaWQgKnJtX2ludDA0OworZXh0ZXJuIHZvaWQgKnJtX2ludDA1OworZXh0ZXJuIHZvaWQgKnJtX2ludDA2OworZXh0ZXJuIHZvaWQgKnJtX2ludDA3OworZXh0ZXJuIHZvaWQgKnJtX2ludDA4OworZXh0ZXJuIHZvaWQgKnJtX2ludDA5OworZXh0ZXJuIHZvaWQgKnJtX2ludDBhOworZXh0ZXJuIHZvaWQgKnJtX2ludDBiOworZXh0ZXJuIHZvaWQgKnJtX2ludDBjOworZXh0ZXJuIHZvaWQgKnJtX2ludDBkOworZXh0ZXJuIHZvaWQgKnJtX2ludDBlOworZXh0ZXJuIHZvaWQgKnJtX2ludDBmOworZXh0ZXJuIHZvaWQgKnJtX2ludDEwOworZXh0ZXJuIHZvaWQgKnJtX2ludDExOworZXh0ZXJuIHZvaWQgKnJtX2ludDEyOworZXh0ZXJuIHZvaWQgKnJtX2ludDEzOworZXh0ZXJuIHZvaWQgKnJtX2ludDE0OworZXh0ZXJuIHZvaWQgKnJtX2ludDE1OworZXh0ZXJuIHZvaWQgKnJtX2ludDE2OworZXh0ZXJuIHZvaWQgKnJtX2ludDE3OworZXh0ZXJuIHZvaWQgKnJtX2ludDE4OworZXh0ZXJuIHZvaWQgKnJtX2ludDE5OworZXh0ZXJuIHZvaWQgKnJtX2ludDFhOworZXh0ZXJuIHZvaWQgKnJtX2ludDFiOworZXh0ZXJuIHZvaWQgKnJtX2ludDFjOworZXh0ZXJuIHZvaWQgKnJtX2ludDFkOworZXh0ZXJuIHZvaWQgKnJtX2ludDFlOworZXh0ZXJuIHZvaWQgKnJtX2ludDFmOworZXh0ZXJuIHZvaWQgKnJtX2RlZl9pbnQ7CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbnN0YWxsIGFuIGludGVycnVwdCB2ZWN0b3IKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitzdGF0aWMgdm9pZCBzZXR2ZWN0b3IoaW50IHZlY3RvciwgdTE2IHNlZ21lbnQsIHZvaWQgKmhhbmRsZXIpCit7CisJdTE2ICpwdHIgPSAodTE2KikodmVjdG9yKjQpOworCXB0clswXSA9ICgodTMyKWhhbmRsZXIgLSAoc2VnbWVudCA8PCA0KSkmMHhmZmZmOworCXB0clsxXSA9IHNlZ21lbnQ7CisJCisjaWYgMAkKKwlwcmludGYoInNldHZlY3RvcjogaW50JTAyeCAtPiAlMDR4OiUwNHhcbiIsCisJICAgICAgIHZlY3RvciwgcHRyWzFdLCBwdHJbMF0pOworI2VuZGlmCQorfQorCitpbnQgYmlvc19zZXR1cCh2b2lkKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCXN0YXRpYyBpbnQgZG9uZT0wOwkKKwlpbnQgdmVjdG9yOworCQorCWlmIChkb25lKSB7CisJCXJldHVybiAwOworCX0KKwlkb25lID0gMTsKKwkKKwlpZiAoaTM4NmJvb3RfYmlvc19zaXplID4gNjU1MzYpIHsKKwkJcHJpbnRmKCJCSU9TIHRvbyBsYXJnZSAoJWxkIGJ5dGVzLCBtYXggaXMgNjU1MzYpXG4iLCAKKwkJICAgICAgIGkzODZib290X2Jpb3Nfc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisJCisJbWVtY3B5KEJJT1NfQkFTRSwgKHZvaWQqKWkzODZib290X2Jpb3MsIGkzODZib290X2Jpb3Nfc2l6ZSk7CisKKwkvKiBjbGVhciBiZGEgKi8KKwltZW1zZXQoQklPU19EQVRBLCAwLCBCSU9TX0RBVEFfU0laRSk7CisJCisJLyogZW50ZXIgc29tZSB2YWx1ZXMgdG8gdGhlIGJkYSAqLworCXdyaXRldygweDNmOCwgQklPU19EQVRBKTsgICAvKiBjb20xIGFkZHIgKi8KKwl3cml0ZXcoMHgyZjgsIEJJT1NfREFUQSsyKTsgLyogY29tMiBhZGRyICovCisJd3JpdGV3KDB4M2U4LCBCSU9TX0RBVEErNCk7IC8qIGNvbTMgYWRkciAqLworCXdyaXRldygweDJlOCwgQklPU19EQVRBKzYpOyAvKiBjb200IGFkZHIgKi8KKwl3cml0ZXcoMHgyNzgsIEJJT1NfREFUQSs4KTsgLyogbHB0MSBhZGRyICovCisJLyoKKwkgKiBUaGUga2VybmVsIHdhbnRzIHRvIHJlYWQgdGhlIGJhc2UgbWVtb3J5IHNpemUKKwkgKiBmcm9tIDQwOjEzLiBQdXQgYSB6ZXJvIHRoZXJlIHRvIGF2b2lkIGFuIGVycm9yIG1lc3NhZ2UKKwkgKi8KKwl3cml0ZXcoMCwgQklPU19EQVRBKzB4MTMpOyAgLyogYmFzZSBtZW1vcnkgc2l6ZSAqLworCisJCisJLyogc2V0dXAgcmVhbG1vZGUgaW50ZXJydXB0IHZlY3RvcnMgKi8JCisJZm9yICh2ZWN0b3IgPSAwOyB2ZWN0b3IgPCBOVU1WRUNUUzsgdmVjdG9yKyspIHsKKwkJc2V0dmVjdG9yKHZlY3RvciwgQklPU19DUywgJnJtX2RlZl9pbnQpOworCX0KKwkKKwlzZXR2ZWN0b3IoMHgwMCwgQklPU19DUywgJnJtX2ludDAwKTsKKwlzZXR2ZWN0b3IoMHgwMSwgQklPU19DUywgJnJtX2ludDAxKTsKKwlzZXR2ZWN0b3IoMHgwMiwgQklPU19DUywgJnJtX2ludDAyKTsKKwlzZXR2ZWN0b3IoMHgwMywgQklPU19DUywgJnJtX2ludDAzKTsKKwlzZXR2ZWN0b3IoMHgwNCwgQklPU19DUywgJnJtX2ludDA0KTsKKwlzZXR2ZWN0b3IoMHgwNSwgQklPU19DUywgJnJtX2ludDA1KTsKKwlzZXR2ZWN0b3IoMHgwNiwgQklPU19DUywgJnJtX2ludDA2KTsKKwlzZXR2ZWN0b3IoMHgwNywgQklPU19DUywgJnJtX2ludDA3KTsKKwlzZXR2ZWN0b3IoMHgwOCwgQklPU19DUywgJnJtX2ludDA4KTsKKwlzZXR2ZWN0b3IoMHgwOSwgQklPU19DUywgJnJtX2ludDA5KTsKKwlzZXR2ZWN0b3IoMHgwYSwgQklPU19DUywgJnJtX2ludDBhKTsKKwlzZXR2ZWN0b3IoMHgwYiwgQklPU19DUywgJnJtX2ludDBiKTsKKwlzZXR2ZWN0b3IoMHgwYywgQklPU19DUywgJnJtX2ludDBjKTsKKwlzZXR2ZWN0b3IoMHgwZCwgQklPU19DUywgJnJtX2ludDBkKTsKKwlzZXR2ZWN0b3IoMHgwZSwgQklPU19DUywgJnJtX2ludDBlKTsKKwlzZXR2ZWN0b3IoMHgwZiwgQklPU19DUywgJnJtX2ludDBmKTsKKwlzZXR2ZWN0b3IoMHgxMCwgQklPU19DUywgJnJtX2ludDEwKTsKKwlzZXR2ZWN0b3IoMHgxMSwgQklPU19DUywgJnJtX2ludDExKTsKKwlzZXR2ZWN0b3IoMHgxMiwgQklPU19DUywgJnJtX2ludDEyKTsKKwlzZXR2ZWN0b3IoMHgxMywgQklPU19DUywgJnJtX2ludDEzKTsKKwlzZXR2ZWN0b3IoMHgxNCwgQklPU19DUywgJnJtX2ludDE0KTsKKwlzZXR2ZWN0b3IoMHgxNSwgQklPU19DUywgJnJtX2ludDE1KTsKKwlzZXR2ZWN0b3IoMHgxNiwgQklPU19DUywgJnJtX2ludDE2KTsKKwlzZXR2ZWN0b3IoMHgxNywgQklPU19DUywgJnJtX2ludDE3KTsKKwlzZXR2ZWN0b3IoMHgxOCwgQklPU19DUywgJnJtX2ludDE4KTsKKwlzZXR2ZWN0b3IoMHgxOSwgQklPU19DUywgJnJtX2ludDE5KTsKKwlzZXR2ZWN0b3IoMHgxYSwgQklPU19DUywgJnJtX2ludDFhKTsKKwlzZXR2ZWN0b3IoMHgxYiwgQklPU19DUywgJnJtX2ludDFiKTsKKwlzZXR2ZWN0b3IoMHgxYywgQklPU19DUywgJnJtX2ludDFjKTsKKwlzZXR2ZWN0b3IoMHgxZCwgQklPU19DUywgJnJtX2ludDFkKTsKKwlzZXR2ZWN0b3IoMHgxZSwgQklPU19DUywgJnJtX2ludDFlKTsKKwlzZXR2ZWN0b3IoMHgxZiwgQklPU19DUywgJnJtX2ludDFmKTsKKworCS8qIGZpbGwgaW4gZGF0YSBhcmVhICovCisJcmFtX2luXzY0a2JfY2h1bmtzID0gZ2QtPnJhbV9zaXplID4+IDE2OworCWJpb3NfZXF1aXBtZW50ID0gMDsgLyogRml4TWUgKi8KKwkKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvbGliX2kzODYvYm9hcmQuYyBiL2xpYl9pMzg2L2JvYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkzODYwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYl9pMzg2L2JvYXJkLmMKQEAgLTAsMCArMSw0NDggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQorICogCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKiAKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHdhdGNoZG9nLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGRldmljZXMuaD4KKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8c3lzY2FsbC5oPgorI2luY2x1ZGUgPG5ldC5oPgorI2luY2x1ZGUgPGlkZS5oPgorCitleHRlcm4gbG9uZyBfaTM4NmJvb3Rfc3RhcnQ7CSAgICAKK2V4dGVybiBsb25nIF9pMzg2Ym9vdF9lbmQ7CSAgICAKK2V4dGVybiBsb25nIF9pMzg2Ym9vdF9yb21kYXRhX3N0YXJ0OworZXh0ZXJuIGxvbmcgX2kzODZib290X3JvbWRhdGFfZGVzdDsgCitleHRlcm4gbG9uZyBfaTM4NmJvb3Rfcm9tZGF0YV9zaXplOyAKK2V4dGVybiBsb25nIF9pMzg2Ym9vdF9ic3Nfc3RhcnQ7ICAgCitleHRlcm4gbG9uZyBfaTM4NmJvb3RfYnNzX3NpemU7ICAgIAorCitleHRlcm4gbG9uZyBfaTM4NmJvb3RfcmVhbG1vZGU7ICAgIAorZXh0ZXJuIGxvbmcgX2kzODZib290X3JlYWxtb2RlX3NpemU7CitleHRlcm4gbG9uZyBfaTM4NmJvb3RfYmlvczsgICAgICAgICAKK2V4dGVybiBsb25nIF9pMzg2Ym9vdF9iaW9zX3NpemU7ICAgIAorCisvKiBUaGUgc3ltYm9scyBkZWZpbmVkIGJ5IHRoZSBsaW5rZXIgc2NyaXB0IGJlY29tZXMgcG9pbnRlcnMKKyAqIHdoaWNoIGlzIHNvbWV3aGF0IGluY29udmVpZW50IC4uLiAqLwordWxvbmcgaTM4NmJvb3Rfc3RhcnQgICAgICAgICA9ICh1bG9uZykmX2kzODZib290X3N0YXJ0OyAgICAgICAgIC8qIGNvZGUgc3RhcnQgKGluIGZsYXNoKSBkZWZpbmVkIGluIHN0YXJ0LlMgKi8KK3Vsb25nIGkzODZib290X2VuZCAgICAgICAgICAgPSAodWxvbmcpJl9pMzg2Ym9vdF9lbmQ7CSAgICAgICAgLyogY29kZSBlbmQgKGluIGZsYXNoKSAqLwordWxvbmcgaTM4NmJvb3Rfcm9tZGF0YV9zdGFydCA9ICh1bG9uZykmX2kzODZib290X3JvbWRhdGFfc3RhcnQ7IC8qIGRhdGFzZWdtZW50IGluIGZsYXNoIChhbHNvIGNvZGUrcm9kYXRhIGVuZCkgKi8KK3Vsb25nIGkzODZib290X3JvbWRhdGFfZGVzdCAgPSAodWxvbmcpJl9pMzg2Ym9vdF9yb21kYXRhX2Rlc3Q7ICAvKiBkYXRhIGxvY2F0aW9uIHNlZ21lbnQgaW4gcmFtICovCit1bG9uZyBpMzg2Ym9vdF9yb21kYXRhX3NpemUgID0gKHVsb25nKSZfaTM4NmJvb3Rfcm9tZGF0YV9zaXplOyAgLyogc2l6ZSBvZiBkYXRhIHNlZ21lbnQgKi8KK3Vsb25nIGkzODZib290X2Jzc19zdGFydCAgICAgPSAodWxvbmcpJl9pMzg2Ym9vdF9ic3Nfc3RhcnQ7ICAgICAvKiBic3Mgc3RhcnQgKi8KK3Vsb25nIGkzODZib290X2Jzc19zaXplICAgICAgPSAodWxvbmcpJl9pMzg2Ym9vdF9ic3Nfc2l6ZTsgICAgICAvKiBic3Mgc2l6ZSAqLworCit1bG9uZyBpMzg2Ym9vdF9yZWFsbW9kZSAgICAgID0gKHVsb25nKSZfaTM4NmJvb3RfcmVhbG1vZGU7ICAgICAgLyogc3RhcnQgb2YgcmVhbG1vZGUgZW50cnkgY29kZSAqLwordWxvbmcgaTM4NmJvb3RfcmVhbG1vZGVfc2l6ZSA9ICh1bG9uZykmX2kzODZib290X3JlYWxtb2RlX3NpemU7IC8qIHNpemUgb2YgcmVhbG1vZGUgZW50cnkgY29kZSAqLwordWxvbmcgaTM4NmJvb3RfYmlvcyAgICAgICAgICA9ICh1bG9uZykmX2kzODZib290X2Jpb3M7ICAgICAgICAgIC8qIHN0YXJ0IG9mIEJJT1MgZW11bGF0aW9uIGNvZGUgKi8KK3Vsb25nIGkzODZib290X2Jpb3Nfc2l6ZSAgICAgPSAodWxvbmcpJl9pMzg2Ym9vdF9iaW9zX3NpemU7ICAgICAvKiBzaXplIG9mIEJJT1MgZW11bGF0aW9uIGNvZGUgKi8KKworCitjb25zdCBjaGFyIHZlcnNpb25fc3RyaW5nW10gPQorCVVfQk9PVF9WRVJTSU9OIiAoIiBfX0RBVEVfXyAiIC0gIiBfX1RJTUVfXyAiKSI7CisKKworLyoKKyAqIEJlZ2luIGFuZCBFbmQgb2YgbWVtb3J5IGFyZWEgZm9yIG1hbGxvYygpLCBhbmQgY3VycmVudCAiYnJrIgorICovCitzdGF0aWMgdWxvbmcgbWVtX21hbGxvY19zdGFydCA9IDA7CitzdGF0aWMgdWxvbmcgbWVtX21hbGxvY19lbmQgPSAwOworc3RhdGljIHVsb25nIG1lbV9tYWxsb2NfYnJrID0gMDsKKworc3RhdGljIGludCBtZW1fbWFsbG9jX2luaXQodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKyAgICAgICAgCisjaWYgMQkKKwkvKiBzdGFydCBtYWxsb2MgYXJlYSByaWdodCBhZnRlciB0aGUgc3RhY2sgKi8KKwltZW1fbWFsbG9jX3N0YXJ0ID0gaTM4NmJvb3RfYnNzX3N0YXJ0ICsgCisJCWkzODZib290X2Jzc19zaXplICsgQ0ZHX1NUQUNLX1NJWkU7CisJbWVtX21hbGxvY19zdGFydCA9IChtZW1fbWFsbG9jX3N0YXJ0KzMpJn4zOworI2Vsc2UKKwltZW1fbWFsbG9jX3N0YXJ0ID0gMHg0MDAwMDA7CisjZW5kaWYJCisjaWYgMQorCS8qIFVzZSBhbGwgYXZhaWxhYmxlIFJBTSBmb3IgbWFsbG9jKCkgKi8KKwltZW1fbWFsbG9jX2VuZCA9IGdkLT5yYW1fc2l6ZTsKKyNlbHNlCQorCS8qIFVzZSBvbmx5ICBDT05GSUdfTUFMTE9DX1NJWkUgYnl0ZXMgb2YgUkFNIGZvciBtYWxsb2MoKSAqLworCW1lbV9tYWxsb2NfZW5kID0gbWVtX21hbGxvY19zdGFydCArIENPTkZJR19NQUxMT0NfU0laRTsKKyNlbmRpZgkKKwltZW1fbWFsbG9jX2JyayA9IG1lbV9tYWxsb2Nfc3RhcnQ7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCAqc2JyayAocHRyZGlmZl90IGluY3JlbWVudCkKK3sKKwl1bG9uZyBvbGQgPSBtZW1fbWFsbG9jX2JyazsKKwl1bG9uZyBuZXcgPSBvbGQgKyBpbmNyZW1lbnQ7CisKKwlpZiAoKG5ldyA8IG1lbV9tYWxsb2Nfc3RhcnQpIHx8IChuZXcgPiBtZW1fbWFsbG9jX2VuZCkpIHsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJbWVtX21hbGxvY19icmsgPSBuZXc7CisKKwlyZXR1cm4gKCh2b2lkICopIG9sZCk7Cit9CisKK2NoYXIgKnN0cm1oeiAoY2hhciAqYnVmLCBsb25nIGh6KQoreworCWxvbmcgbCwgbjsKKwlsb25nIG07CisKKwluID0gaHogLyAxMDAwMDAwTDsKKwlsID0gc3ByaW50ZiAoYnVmLCAiJWxkIiwgbik7CisJbSA9IChoeiAlIDEwMDAwMDBMKSAvIDEwMDBMOworCWlmIChtICE9IDApCisJCXNwcmludGYgKGJ1ZiArIGwsICIuJTAzbGQiLCBtKTsKKwlyZXR1cm4gKGJ1Zik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEluaXQgVXRpbGl0aWVzCQkJCQkJCSoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNvbWUgb2YgdGhpcyBjb2RlIHNob3VsZCBiZSBtb3ZlZCBpbnRvIHRoZSBjb3JlIGZ1bmN0aW9ucywKKyAqIG9yIGRyb3BwZWQgY29tcGxldGVseSwKKyAqIGJ1dCBsZXQncyBnZXQgaXQgd29ya2luZyAoYWdhaW4pIGZpcnN0Li4uCisgKi8KK3N0YXRpYyB2b2lkIHN5c2NhbGxzX2luaXQgKHZvaWQpCit7CisJc3lzY2FsbF90YmxbU1lTQ0FMTF9NQUxMT0NdID0gKHZvaWQgKikgbWFsbG9jOworCXN5c2NhbGxfdGJsW1NZU0NBTExfRlJFRV0gPSAodm9pZCAqKSBmcmVlOworCisJc3lzY2FsbF90YmxbU1lTQ0FMTF9JTlNUQUxMX0hETFJdID0gKHZvaWQgKikgaXJxX2luc3RhbGxfaGFuZGxlcjsKKwlzeXNjYWxsX3RibFtTWVNDQUxMX0ZSRUVfSERMUl0gPSAodm9pZCAqKSBpcnFfZnJlZV9oYW5kbGVyOworCit9CisKK3N0YXRpYyBpbnQgaW5pdF9iYXVkcmF0ZSAodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCXVjaGFyIHRtcFs2NF07CS8qIGxvbmcgZW5vdWdoIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKi8KKwlpbnQgaSA9IGdldGVudl9yICgiYmF1ZHJhdGUiLCB0bXAsIHNpemVvZiAodG1wKSk7CisKKwlnZC0+YmF1ZHJhdGUgPSAoaSA+IDApCisJCQk/IChpbnQpIHNpbXBsZV9zdHJ0b3VsICh0bXAsIE5VTEwsIDEwKQorCQkJOiBDT05GSUdfQkFVRFJBVEU7CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IGRpc3BsYXlfYmFubmVyICh2b2lkKQoreworCisJcHJpbnRmICgiXG5cbiVzXG5cbiIsIHZlcnNpb25fc3RyaW5nKTsKKwlwcmludGYgKCJVLUJvb3QgY29kZTogJTA4bFggLT4gJTA4bFggIGRhdGE6ICUwOGxYIC0+ICUwOGxYXG4iCisJCSIgICAgICAgIEJTUzogJTA4bFggLT4gJTA4bFggc3RhY2s6ICUwOGxYIC0+ICUwOGxYXG4iLAorCQlpMzg2Ym9vdF9zdGFydCwgaTM4NmJvb3Rfcm9tZGF0YV9zdGFydC0xLAorCQlpMzg2Ym9vdF9yb21kYXRhX2Rlc3QsIGkzODZib290X3JvbWRhdGFfZGVzdCtpMzg2Ym9vdF9yb21kYXRhX3NpemUtMSwKKwkJaTM4NmJvb3RfYnNzX3N0YXJ0LCBpMzg2Ym9vdF9ic3Nfc3RhcnQraTM4NmJvb3RfYnNzX3NpemUtMSwKKwkJaTM4NmJvb3RfYnNzX3N0YXJ0K2kzODZib290X2Jzc19zaXplLCAKKwkJaTM4NmJvb3RfYnNzX3N0YXJ0K2kzODZib290X2Jzc19zaXplK0NGR19TVEFDS19TSVpFLTEpOworCQorCisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIFdBUk5JTkc6IHRoaXMgY29kZSBsb29rcyAiY2xlYW5lciIgdGhhbiB0aGUgUG93ZXJQQyB2ZXJzaW9uLCBidXQKKyAqIGhhcyB0aGUgZGlzYWR2YW50YWdlIHRoYXQgeW91IGVpdGhlciBnZXQgbm90aGluZywgb3IgZXZlcnl0aGluZy4KKyAqIE9uIFBvd2VyUEMsIHlvdSBtaWdodCBzZWUgIkRSQU06ICIgYmVmb3JlIHRoZSBzeXN0ZW0gaGFuZ3MgLSB3aGljaAorICogZ2l2ZXMgYSBzaW1wbGUgeWV0IGNsZWFyIGluZGljYXRpb24gd2hpY2ggcGFydCBvZiB0aGUKKyAqIGluaXRpYWxpemF0aW9uIGlmIGZhaWxpbmcuCisgKi8KK3N0YXRpYyBpbnQgZGlzcGxheV9kcmFtX2NvbmZpZyAodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKwlpbnQgaTsKKworCXB1dHMgKCJEUkFNIENvbmZpZ3VyYXRpb246XG4iKTsKKworCWZvciAoaT0wOyBpPENPTkZJR19OUl9EUkFNX0JBTktTOyBpKyspIHsKKwkJcHJpbnRmICgiQmFuayAjJWQ6ICUwOGx4ICIsIGksIGdkLT5iZC0+YmlfZHJhbVtpXS5zdGFydCk7CisJCXByaW50X3NpemUgKGdkLT5iZC0+YmlfZHJhbVtpXS5zaXplLCAiXG4iKTsKKwl9CisJCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQgZGlzcGxheV9mbGFzaF9jb25maWcgKHVsb25nIHNpemUpCit7CisJcHV0cyAoIkZsYXNoOiAiKTsKKwlwcmludF9zaXplIChzaXplLCAiXG4iKTsKK30KKworCisKKy8qCisgKiBCcmVhdGggc29tZSBsaWZlIGludG8gdGhlIGJvYXJkLi4uCisgKgorICogSW5pdGlhbGl6ZSBhbiBTTUMgZm9yIHNlcmlhbCBjb21tcywgYW5kIGNhcnJ5IG91dCBzb21lIGhhcmR3YXJlCisgKiB0ZXN0cy4KKyAqCisgKiBUaGUgZmlyc3QgcGFydCBvZiBpbml0aWFsaXphdGlvbiBpcyBydW5uaW5nIGZyb20gRmxhc2ggbWVtb3J5OworICogaXRzIG1haW4gcHVycG9zZSBpcyB0byBpbml0aWFsaXplIHRoZSBSQU0gc28gdGhhdCB3ZQorICogY2FuIHJlbG9jYXRlIHRoZSBtb25pdG9yIGNvZGUgdG8gUkFNLgorICovCisKKy8qCisgKiBBbGwgYXR0ZW1wdHMgdG8gY29tZSB1cCB3aXRoIGEgImNvbW1vbiIgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UKKyAqIHRoYXQgd29ya3MgZm9yIGFsbCBib2FyZHMgYW5kIGFyY2hpdGVjdHVyZXMgZmFpbGVkOiBzb21lIG9mIHRoZQorICogcmVxdWlyZW1lbnRzIGFyZSBqdXN0IF90b29fIGRpZmZlcmVudC4gVG8gZ2V0IHJpZCBvZiB0aGUgcmVzdWx0aW5nCisgKiBtZXNzIG9mIGJvYXJkIGRlcGVuZGVuZCAjaWZkZWYnZWQgY29kZSB3ZSBub3cgbWFrZSB0aGUgd2hvbGUKKyAqIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlIGNvbmZpZ3VyYWJsZSB0byB0aGUgdXNlci4KKyAqCisgKiBUaGUgcmVxdWlyZW1lbnRzIGZvciBhbnkgbmV3IGluaXRhbGl6YXRpb24gZnVuY3Rpb24gaXMgc2ltcGxlOiBpdAorICogcmVjZWl2ZXMgYSBwb2ludGVyIHRvIHRoZSAiZ2xvYmFsIGRhdGEiIHN0cnVjdHVyZSBhcyBpdCdzIG9ubHkKKyAqIGFyZ3VtZW50LCBhbmQgcmV0dXJucyBhbiBpbnRlZ2VyIHJldHVybiBjb2RlLCB3aGVyZSAwIG1lYW5zCisgKiAiY29udGludWUiIGFuZCAhPSAwIG1lYW5zICJmYXRhbCBlcnJvciwgaGFuZyB0aGUgc3lzdGVtIi4KKyAqLwordHlwZWRlZiBpbnQgKGluaXRfZm5jX3QpICh2b2lkKTsKKworaW5pdF9mbmNfdCAqaW5pdF9zZXF1ZW5jZVtdID0geworCWNwdV9pbml0LAkJLyogYmFzaWMgY3B1IGRlcGVuZGVudCBzZXR1cCAqLworCWJvYXJkX2luaXQsCQkvKiBiYXNpYyBib2FyZCBkZXBlbmRlbnQgc2V0dXAgKi8KKwlkcmFtX2luaXQsCQkvKiBjb25maWd1cmUgYXZhaWxhYmxlIFJBTSBiYW5rcyAqLworCW1lbV9tYWxsb2NfaW5pdCwgICAgICAgIC8qIGRlcGVuZGFudCBvbiBkcmFtX2luaXQgKi8KKwlpbnRlcnJ1cHRfaW5pdCwJCS8qIHNldCB1cCBleGNlcHRpb25zICovCisJdGltZXJfaW5pdCwJCisJZW52X2luaXQsCQkvKiBpbml0aWFsaXplIGVudmlyb25tZW50ICovCisJaW5pdF9iYXVkcmF0ZSwJCS8qIGluaXRpYWx6ZSBiYXVkcmF0ZSBzZXR0aW5ncyAqLworCXNlcmlhbF9pbml0LAkJLyogc2VyaWFsIGNvbW11bmljYXRpb25zIHNldHVwICovCisJZGlzcGxheV9iYW5uZXIsCisJZGlzcGxheV9kcmFtX2NvbmZpZywKKworCU5VTEwsCit9OworCitnZF90ICpnbG9iYWxfZGF0YTsKKwordm9pZCBzdGFydF9pMzg2Ym9vdCAodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKwljaGFyICpzOworCWludCBpOworCXVsb25nIHNpemU7CisJc3RhdGljIGdkX3QgZ2RfZGF0YTsKKwlzdGF0aWMgYmRfdCBiZF9kYXRhOworCWluaXRfZm5jX3QgKippbml0X2ZuY19wdHI7CisJCisJc2hvd19ib290X3Byb2dyZXNzKDB4MjEpOworCisJZ2QgPSBnbG9iYWxfZGF0YSA9ICZnZF9kYXRhOworCQorCW1lbXNldCAoZ2QsIDAsIHNpemVvZiAoZ2RfdCkpOworCWdkLT5iZCA9ICZiZF9kYXRhOworCW1lbXNldCAoZ2QtPmJkLCAwLCBzaXplb2YgKGJkX3QpKTsKKwlzaG93X2Jvb3RfcHJvZ3Jlc3MoMHgyMik7CisKKwkKKwlmb3IgKGluaXRfZm5jX3B0ciA9IGluaXRfc2VxdWVuY2UsIGk9MDsgKmluaXRfZm5jX3B0cjsgKytpbml0X2ZuY19wdHIsIGkrKykgeworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MoMHhhMTMwfGkpOworCisJCWlmICgoKmluaXRfZm5jX3B0cikoKSAhPSAwKSB7CisJCQloYW5nICgpOworCQl9CisJfQorCXNob3dfYm9vdF9wcm9ncmVzcygweDIzKTsKKworCS8qIGNvbmZpZ3VyZSBhdmFpbGFibGUgRkxBU0ggYmFua3MgKi8KKwlzaXplID0gZmxhc2hfaW5pdCgpOworCWRpc3BsYXlfZmxhc2hfY29uZmlnKHNpemUpOworCXNob3dfYm9vdF9wcm9ncmVzcygweDI0KTsKKworCXNob3dfYm9vdF9wcm9ncmVzcygweDI1KTsKKworCS8qIGluaXRpYWxpemUgZW52aXJvbm1lbnQgKi8KKwllbnZfcmVsb2NhdGUgKCk7CisJc2hvd19ib290X3Byb2dyZXNzKDB4MjYpOworCisKKwkvKiBJUCBBZGRyZXNzICovCisJYmRfZGF0YS5iaV9pcF9hZGRyID0gZ2V0ZW52X0lQYWRkciAoImlwYWRkciIpOworCisJLyogTUFDIEFkZHJlc3MgKi8KKwl7CisJCWludCBpOworCQl1bG9uZyByZWc7CisJCWNoYXIgKnMsICplOworCQl1Y2hhciB0bXBbNjRdOworCisJCWkgPSBnZXRlbnZfciAoImV0aGFkZHIiLCB0bXAsIHNpemVvZiAodG1wKSk7CisJCXMgPSAoaSA+IDApID8gdG1wIDogTlVMTDsKKworCQlmb3IgKHJlZyA9IDA7IHJlZyA8IDY7ICsrcmVnKSB7CisJCQliZF9kYXRhLmJpX2VuZXRhZGRyW3JlZ10gPSBzID8gc2ltcGxlX3N0cnRvdWwgKHMsICZlLCAxNikgOiAwOworCQkJaWYgKHMpCisJCQkJcyA9ICgqZSkgPyBlICsgMSA6IGU7CisJCX0KKwl9CisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisJLyoKKwkgKiBEbyBwY2kgY29uZmlndXJhdGlvbgorCSAqLworCXBjaV9pbml0KCk7CisjZW5kaWYKKworCXNob3dfYm9vdF9wcm9ncmVzcygweDI3KTsKKworCisJZGV2aWNlc19pbml0ICgpOworCisJLyogYWxsb2NhdGUgc3lzY2FsbHMgdGFibGUgKGNvbnNvbGVfaW5pdF9yIHdpbGwgZmlsbCBpdCBpbiAqLworCXN5c2NhbGxfdGJsID0gKHZvaWQgKiopIG1hbGxvYyAoTlJfU1lTQ0FMTFMgKiBzaXplb2YgKHZvaWQgKikpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgY29uc29sZSAoYWZ0ZXIgdGhlIHJlbG9jYXRpb24gYW5kIGRldmljZXMgaW5pdCkgKi8KKwljb25zb2xlX2luaXRfcigpOworCXN5c2NhbGxzX2luaXQoKTsKKworI2lmZGVmIENPTkZJR19NSVNDX0lOSVRfUgorCS8qIG1pc2NlbGxhbmVvdXMgcGxhdGZvcm0gZGVwZW5kZW50IGluaXRpYWxpc2F0aW9ucyAqLworCW1pc2NfaW5pdF9yKCk7CisjZW5kaWYKKworCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiAoMCkKKwlXQVRDSERPR19SRVNFVCgpOworIyBpZmRlZiBERUJVRworCXB1dHMgKCJSZXNldCBFdGhlcm5ldCBQSFlcbiIpOworIyBlbmRpZgorCXJlc2V0X3BoeSgpOworI2VuZGlmCisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpICYmICEoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCisJV0FUQ0hET0dfUkVTRVQoKTsKKwlwdXRzICgiUENNQ0lBOiIpOworCXBjbWNpYV9pbml0KCk7CisjZW5kaWYKKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisJV0FUQ0hET0dfUkVTRVQoKTsKKwlwdXRzKCJLR0RCOiAgIik7CisJa2dkYl9pbml0KCk7CisjZW5kaWYKKworCS8qIGVuYWJsZSBleGNlcHRpb25zICovCisJZW5hYmxlX2ludGVycnVwdHMgKCk7CisJc2hvd19ib290X3Byb2dyZXNzKDB4MjgpOworCisJLyogTXVzdCBoYXBwZW4gYWZ0ZXIgaW50ZXJydXB0cyBhcmUgaW5pdGlhbGl6ZWQgc2luY2UKKwkgKiBhbiBpcnEgaGFuZGxlciBnZXRzIGluc3RhbGxlZAorCSAqLworI2lmZGVmIENPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTworCXNlcmlhbF9idWZmZXJlZF9pbml0KCk7CisjZW5kaWYKKyAgICAKKyNpZmRlZiBDT05GSUdfU1RBVFVTX0xFRAorCXN0YXR1c19sZWRfc2V0IChTVEFUVVNfTEVEX0JPT1QsIFNUQVRVU19MRURfQkxJTktJTkcpOworI2VuZGlmCisKKwl1ZGVsYXkgKDIwKTsKKworCXNldF90aW1lciAoMCk7CisKKwkvKiBJbml0aWFsaXplIGZyb20gZW52aXJvbm1lbnQgKi8KKwlpZiAoKHMgPSBnZXRlbnYgKCJsb2FkYWRkciIpKSAhPSBOVUxMKSB7CisJCWxvYWRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsIChzLCBOVUxMLCAxNik7CisJfQorI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKwlpZiAoKHMgPSBnZXRlbnYgKCJib290ZmlsZSIpKSAhPSBOVUxMKSB7CisJCWNvcHlfZmlsZW5hbWUgKEJvb3RGaWxlLCBzLCBzaXplb2YgKEJvb3RGaWxlKSk7CisJfQorI2VuZGlmIC8qIENGR19DTURfTkVUICovCisKKwlXQVRDSERPR19SRVNFVCgpOworCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQorCVdBVENIRE9HX1JFU0VUKCk7CisJcHV0cygiSURFOiAgICIpOworCWlkZV9pbml0KCk7CisjZW5kaWYgLyogQ0ZHX0NNRF9JREUgKi8KKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpCisJV0FUQ0hET0dfUkVTRVQoKTsKKwlwdXRzKCJTQ1NJOiAgIik7CisJc2NzaV9pbml0KCk7CisjZW5kaWYKKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RPQykKKwlXQVRDSERPR19SRVNFVCgpOworCXB1dHMgKCJET0M6ICAgIik7CisJZG9jX2luaXQoKTsKKyNlbmRpZgorCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpCisJV0FUQ0hET0dfUkVTRVQoKTsKKwlwdXRzKCJOZXQ6ICAgIik7CisJZXRoX2luaXRpYWxpemUoZ2QtPmJkKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0xBU1RfU1RBR0VfSU5JVAorCVdBVENIRE9HX1JFU0VUKCk7CisJLyoKKwkgKiBTb21lIHBhcnRzIGNhbiBiZSBvbmx5IGluaXRpYWxpemVkIGlmIGFsbCBvdGhlcnMgKGxpa2UKKwkgKiBJbnRlcnJ1cHRzKSBhcmUgdXAgYW5kIHJ1bm5pbmcgKGkuZS4gdGhlIFBDLXN0eWxlIElTQQorCSAqIGtleWJvYXJkKS4KKwkgKi8KKwlsYXN0X3N0YWdlX2luaXQoKTsKKyNlbmRpZgorCisKKworI2lmZGVmIENPTkZJR19QT1NUCisJcG9zdF9ydW4gKE5VTEwsIFBPU1RfUkFNIHwgcG9zdF9ib290bW9kZV9nZXQoMCkpOworCWlmIChwb3N0X2Jvb3Rtb2RlX2dldCgwKSAmIFBPU1RfUE9XRVJGQUlMKSB7CisJCXBvc3RfYm9vdG1vZGVfY2xlYXIoKTsKKwkJYm9hcmRfcG93ZXJvZmYoKTsKKwl9CisjZW5kaWYKKworCXNob3dfYm9vdF9wcm9ncmVzcygweDI5KTsKKwkKKwkvKiBtYWluX2xvb3AoKSBjYW4gcmV0dXJuIHRvIHJldHJ5IGF1dG9ib290LCBpZiBzbyBqdXN0IHJ1biBpdCBhZ2Fpbi4gKi8KKwlmb3IgKDs7KSB7CisJCW1haW5fbG9vcCAoKTsKKwl9CisKKwkvKiBOT1RSRUFDSEVEIC0gbm8gd2F5IG91dCBvZiBjb21tYW5kIGxvb3AgZXhjZXB0IGJvb3RpbmcgKi8KK30KKwordm9pZCBoYW5nICh2b2lkKQoreworCXB1dHMgKCIjIyMgRVJST1IgIyMjIFBsZWFzZSBSRVNFVCB0aGUgYm9hcmQgIyMjXG4iKTsKKwlmb3IgKDs7KTsKK30KKworCmRpZmYgLS1naXQgYS9saWJfaTM4Ni9pMzg2X2xpbnV4LmMgYi9saWJfaTM4Ni9pMzg2X2xpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3YTBkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYl9pMzg2L2kzODZfbGludXguYwpAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxICBFcmlrIE1vdXcgKEouQS5LLk1vdXdAaXRzLnR1ZGVsZnQubmwpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGNtZF9ib290Lmg+CisjaW5jbHVkZSA8aW1hZ2UuaD4KKyNpbmNsdWRlIDx6bGliLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS96aW1hZ2UuaD4KKworCitleHRlcm4gaW1hZ2VfaGVhZGVyX3QgaGVhZGVyOyAgICAgICAgICAgLyogZnJvbSBjbWRfYm9vdG0uYyAqLworCisKK2ltYWdlX2hlYWRlcl90ICpmYWtlX2hlYWRlcihpbWFnZV9oZWFkZXJfdCAqaGRyLCB2b2lkICpwdHIsIGludCBzaXplKQoreworCS8qIHRyeSBlYWNoIHN1cHBvcnRlZCBpbWFnZSB0eXBlIGluIG9yZGVyICovCisJaWYgKE5VTEwgIT0gZmFrZV96aW1hZ2VfaGVhZGVyKGhkciwgcHRyLCBzaXplKSkgeworCQlyZXR1cm4gaGRyOworCX0KKwkKKwlyZXR1cm4gTlVMTDsKK30KKworCit2b2lkIGRvX2Jvb3RtX2xpbnV4KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdLAorCQl1bG9uZyBhZGRyLCB1bG9uZyAqbGVuX3B0ciwgaW50ICAgdmVyaWZ5KQoreworCXVsb25nIGJhc2VfcHRyOworCQorCXVsb25nIGxlbiA9IDAsIGNoZWNrc3VtOworCXVsb25nIGluaXRyZF9zdGFydCwgaW5pdHJkX2VuZDsKKwl1bG9uZyBkYXRhOworCWltYWdlX2hlYWRlcl90ICpoZHIgPSAmaGVhZGVyOworCQorCS8qCisJICogQ2hlY2sgaWYgdGhlcmUgaXMgYW4gaW5pdHJkIGltYWdlCisJICovCisJaWYgKGFyZ2MgPj0gMykgeworCQlhZGRyID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTYpOworCQkKKwkJcHJpbnRmICgiIyMgTG9hZGluZyBSYW1kaXNrIEltYWdlIGF0ICUwOGx4IC4uLlxuIiwgYWRkcik7CisJCQorCQkvKiBDb3B5IGhlYWRlciBzbyB3ZSBjYW4gYmxhbmsgQ1JDIGZpZWxkIGZvciByZS1jYWxjdWxhdGlvbiAqLworCQltZW1jcHkgKCZoZWFkZXIsIChjaGFyICopYWRkciwgc2l6ZW9mKGltYWdlX2hlYWRlcl90KSk7CisJCQorCQlpZiAobnRvaGwoaGRyLT5paF9tYWdpYykgIT0gSUhfTUFHSUMpIHsKKwkJCXByaW50ZiAoIkJhZCBNYWdpYyBOdW1iZXJcbiIpOworCQkJZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKKwkJfQorCQkKKwkJZGF0YSA9ICh1bG9uZykmaGVhZGVyOworCQlsZW4gID0gc2l6ZW9mKGltYWdlX2hlYWRlcl90KTsKKwkJCisJCWNoZWNrc3VtID0gbnRvaGwoaGRyLT5paF9oY3JjKTsKKwkJaGRyLT5paF9oY3JjID0gMDsKKwkJCisJCWlmIChjcmMzMiAoMCwgKGNoYXIgKilkYXRhLCBsZW4pICE9IGNoZWNrc3VtKSB7CisJCQlwcmludGYgKCJCYWQgSGVhZGVyIENoZWNrc3VtXG4iKTsKKwkJCWRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CisJCX0KKwkJCisJCXByaW50X2ltYWdlX2hkciAoaGRyKTsKKwkJCisJCWRhdGEgPSBhZGRyICsgc2l6ZW9mKGltYWdlX2hlYWRlcl90KTsKKwkJbGVuICA9IG50b2hsKGhkci0+aWhfc2l6ZSk7CisJCQorCQlpZiAodmVyaWZ5KSB7CisJCQl1bG9uZyBjc3VtID0gMDsKKwkJCQorCQkJcHJpbnRmICgiICAgVmVyaWZ5aW5nIENoZWNrc3VtIC4uLiAiKTsKKwkJCWNzdW0gPSBjcmMzMiAoMCwgKGNoYXIgKilkYXRhLCBsZW4pOworCQkJaWYgKGNzdW0gIT0gbnRvaGwoaGRyLT5paF9kY3JjKSkgeworCQkJCXByaW50ZiAoIkJhZCBEYXRhIENSQ1xuIik7CisJCQkJZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKKwkJCX0KKwkJCXByaW50ZiAoIk9LXG4iKTsKKwkJfQorCQkKKwkJaWYgKChoZHItPmloX29zICAgIT0gSUhfT1NfTElOVVgpCXx8CisJCSAgICAoaGRyLT5paF9hcmNoICE9IElIX0NQVV9JMzg2KQl8fAorCQkgICAgKGhkci0+aWhfdHlwZSAhPSBJSF9UWVBFX1JBTURJU0spCSkgeworCQkJcHJpbnRmICgiTm8gTGludXggaTM4NiBSYW1kaXNrIEltYWdlXG4iKTsKKwkJCWRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CisJCX0KKwkJCisJCS8qCisJCSAqIE5vdyBjaGVjayBpZiB3ZSBoYXZlIGEgbXVsdGlmaWxlIGltYWdlCisJCSAqLworCX0gZWxzZSBpZiAoKGhkci0+aWhfdHlwZT09SUhfVFlQRV9NVUxUSSkgJiYgKGxlbl9wdHJbMV0pKSB7CisJCXVsb25nIHRhaWwgICAgPSBudG9obChsZW5fcHRyWzBdKSAlIDQ7CisJCWludCBpOworCQkKKwkJLyogc2tpcCBrZXJuZWwgbGVuZ3RoIGFuZCB0ZXJtaW5hdG9yICovCisJCWRhdGEgPSAodWxvbmcpKCZsZW5fcHRyWzJdKTsKKwkJLyogc2tpcCBhbnkgYWRkaXRpb25hbCBpbWFnZSBsZW5ndGggZmllbGRzICovCisJCWZvciAoaT0xOyBsZW5fcHRyW2ldOyArK2kpCisJCQlkYXRhICs9IDQ7CisJCS8qIGFkZCBrZXJuZWwgbGVuZ3RoLCBhbmQgYWxpZ24gKi8KKwkJZGF0YSArPSBudG9obChsZW5fcHRyWzBdKTsKKwkJaWYgKHRhaWwpIHsKKwkJCWRhdGEgKz0gNCAtIHRhaWw7CisJCX0KKwkJCisJCWxlbiAgID0gbnRvaGwobGVuX3B0clsxXSk7CisJCQorCX0gZWxzZSB7CisJCS8qCisJCSAqIG5vIGluaXRyZCBpbWFnZQorCQkgKi8KKwkJZGF0YSA9IDA7CisJfQorCQorI2lmZGVmCURFQlVHCisJaWYgKCFkYXRhKSB7CisJCXByaW50ZiAoIk5vIGluaXRyZFxuIik7CisJfQorI2VuZGlmCisJCisJaWYgKGRhdGEpIHsKKwkJaW5pdHJkX3N0YXJ0ID0gZGF0YTsKKwkJaW5pdHJkX2VuZCAgID0gaW5pdHJkX3N0YXJ0ICsgbGVuOworCQlwcmludGYgKCIgICBMb2FkaW5nIFJhbWRpc2sgdG8gJTA4bHgsIGVuZCAlMDhseCAuLi4gIiwKKwkJCWluaXRyZF9zdGFydCwgaW5pdHJkX2VuZCk7CisJCW1lbW1vdmUgKCh2b2lkICopaW5pdHJkX3N0YXJ0LCAodm9pZCAqKWRhdGEsIGxlbik7CisJCXByaW50ZiAoIk9LXG4iKTsKKwl9IGVsc2UgeworCQlpbml0cmRfc3RhcnQgPSAwOworCQlpbml0cmRfZW5kID0gMDsKKwl9CisJCisJYmFzZV9wdHIgPSBsb2FkX3ppbWFnZShhZGRyICsgc2l6ZW9mKGltYWdlX2hlYWRlcl90KSwgbnRvaGwoaGRyLT5paF9zaXplKSwgCisJCQkgICAgICAgaW5pdHJkX3N0YXJ0LCBpbml0cmRfZW5kLWluaXRyZF9zdGFydCwgMCk7CisKKwlpZiAoTlVMTCA9PSBiYXNlX3B0cikgeworCQlwcmludGYgKCIjIyBLZXJuZWwgbG9hZGluZyBmYWlsZWQgLi4uXG4iKTsKKwkJZG9fcmVzZXQoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOworCQkKKwl9CisJCQorI2lmZGVmIERFQlVHCisJcHJpbnRmICgiIyMgVHJhbnNmZXJyaW5nIGNvbnRyb2wgdG8gTGludXggKGF0IGFkZHJlc3MgJTA4eCkgLi4uXG4iLAorCQkodTMyKWJhc2VfcHRyKTsKKyNlbmRpZgorCQkKKwkvKiB3ZSBhc3N1bWUgdGhhdCB0aGUga2VybmVsIGlzIGluIHBsYWNlICovCisJcHJpbnRmKCJcblN0YXJ0aW5nIGtlcm5lbCAuLi5cblxuIik7CisJCQorCWJvb3RfemltYWdlKGJhc2VfcHRyKTsKKwkKK30KKworCmRpZmYgLS1naXQgYS9saWJfaTM4Ni9pYy9hbGk1MTJ4LmMgYi9saWJfaTM4Ni9pYy9hbGk1MTJ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzNzA5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYl9pMzg2L2ljL2FsaTUxMnguYwpAQCAtMCwwICsxLDQ0MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogRGFuaWVsIEVuZ3N0cvZtLCBPbWljcm9uIENldGkgQUIgPGRhbmllbEBvbWljcm9uLnNlPi4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogQmFzZWQgb24gc2M1MjBjZHAuYyBmcm9tIHJvbG8gMS42OgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMgR21iSAorICogS2xlaW4tV2ludGVybmhlaW0sIEdlcm1hbnkKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaWMvYWxpNTEyeC5oPgorCisKKy8qIEFMSSBNNTEyMyBMb2dpY2FsIGRldmljZSBudW1iZXJzOgorICogMCBGREMKKyAqIDEgdW51c2VkPworICogMiB1bnVzZWQ/CisgKiAzIGxwdAorICogNCBVQVJUMQorICogNSBVQVJUMgorICogNiBSVEMKKyAqIDcgbW91c2Uva2JkCisgKiA4IENJTworICovCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU29tZSBhY2Nlc3MgcHJpbWl0aXZlcyBmb3IgdGhlIEFMaSBjaGlwOiAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworc3RhdGljIHZvaWQgYWxpX3dyaXRlKHU4IGluZGV4LCB1OCB2YWx1ZSkKK3sJCisJLyogd3JpdGUgYW4gYXJiaXJhcnkgcmVnaXN0ZXIgKi8KKwlvdXRiKGluZGV4LCBBTElfSU5ERVgpOworCW91dGIodmFsdWUsIEFMSV9EQVRBKTsKK30KKworc3RhdGljIGludCBhbGlfcmVhZCh1OCBpbmRleCkKK3sKKwlvdXRiKGluZGV4LCBBTElfSU5ERVgpOworCXJldHVybiBpbmIoQUxJX0RBVEEpOworfQorCisjZGVmaW5lIEFMSV9PUEVOKCkgXAorCW91dGIoMHg1MSwgQUxJX0RBVEEpOyBcCisJb3V0YigweDIzLCBBTElfREFUQSkJCisKKworI2RlZmluZSBBTElfQ0xPU0UoKSBcCisJb3V0YigweGJiLCBBTElfREFUQSkKKworLyogU2VsZWN0IGEgbG9naWNhbCBkZXZpY2UgKi8KKyNkZWZpbmUgQUxJX1NFTERFVihkZXYpCVwKKwlhbGlfd3JpdGUoMHgwNywgZGV2KQkKKworCit2b2lkIGFsaTUxMnhfaW5pdCh2b2lkKQoreworCUFMSV9PUEVOKCk7CisKKwlhbGlfd3JpdGUoMHgwMiwgMHgwMSk7CS8qIHNvZnQgcmVzZXQgKi8KKwlhbGlfd3JpdGUoMHgwMywgMHgwMyk7CS8qIGRpc2FibGUgYWNjZXNzIHRvIENJT3MgKi8KKwlhbGlfd3JpdGUoMHgyMiwgMHgwMCk7CS8qIGRpc2FibGUgZGlyZWN0IHBvd2VyZG93biAqLworCWFsaV93cml0ZSgweDIzLCAweDAwKTsJLyogZGlzYWJsZSBhdXRvIHBvd2VyZG93biAqLworCWFsaV93cml0ZSgweDI0LCAweDAwKTsJLyogSVIgOCBpcyBhY3RpdmUgaGksIHBpbjI2IGlzIFBESVIgKi8KKworCUFMSV9DTE9TRSgpOworfQorCit2b2lkIGFsaTUxMnhfc2V0X2ZkYyhpbnQgZW5hYmxlZCwgdTE2IGlvLCB1OCBpcnEsIHU4IGRtYV9jaGFubmVsKQoreworCUFMSV9PUEVOKCk7CisJQUxJX1NFTERFVigwKTsKKwkKKwlhbGlfd3JpdGUoMHgzMCwgZW5hYmxlZD8xOjApOworCWlmIChlbmFibGVkKSB7CisJCWFsaV93cml0ZSgweDYwLCBpbyA+PiA4KTsKKwkJYWxpX3dyaXRlKDB4NjEsIGlvICYgMHhmZik7CisJCWFsaV93cml0ZSgweDcwLCBpcnEpOworCQlhbGlfd3JpdGUoMHg3NCwgZG1hX2NoYW5uZWwpOworCQkKKwkJLyogQVQgbW9kZSwgbm8gZHJpdmUgc3dhcCAqLworCQlhbGlfd3JpdGUoMHhmMCwgMHgwOCk7CisJCWFsaV93cml0ZSgweGYxLCAweDAwKTsKKwkJYWxpX3dyaXRlKDB4ZjIsIDB4ZmYpOworCQlhbGlfd3JpdGUoMHhmNCwgMHgwMCk7CisJfQorCUFMSV9DTE9TRSgpOworfQorCisKK3ZvaWQgYWxpNTEyeF9zZXRfcHAoaW50IGVuYWJsZWQsIHUxNiBpbywgdTggaXJxLCB1OCBkbWFfY2hhbm5lbCkKK3sKKwlBTElfT1BFTigpOworCUFMSV9TRUxERVYoMyk7CisJCisJYWxpX3dyaXRlKDB4MzAsIGVuYWJsZWQ/MTowKTsKKwlpZiAoZW5hYmxlZCkgeworCQlhbGlfd3JpdGUoMHg2MCwgaW8gPj4gOCk7CisJCWFsaV93cml0ZSgweDYxLCBpbyAmIDB4ZmYpOworCQlhbGlfd3JpdGUoMHg3MCwgaXJxKTsKKwkJYWxpX3dyaXRlKDB4NzQsIGRtYV9jaGFubmVsKTsKKwkJCisJCS8qIG1vZGU6IEVQUCAxLjksIEVDUCBGSUZPIHRocmVzaG9sZCA9IDcsIElSUSBhY3RpdmUgbG93ICovCisJCWFsaV93cml0ZSgweGYwLCAweGJjKTsKKwkJLyogMTIgTUh6LCBCdXJzdCBETUEgaW4gRUNQICovCisJCWFsaV93cml0ZSgweGYxLCAweDA1KTsKKwl9CisJQUxJX0NMT1NFKCk7CisKK30KKwordm9pZCBhbGk1MTJ4X3NldF91YXJ0KGludCBlbmFibGVkLCBpbnQgaW5kZXgsIHUxNiBpbywgdTggaXJxKQoreworCUFMSV9PUEVOKCk7CisJQUxJX1NFTERFVihpbmRleD81OjQpOworCQorCWFsaV93cml0ZSgweDMwLCBlbmFibGVkPzE6MCk7CisJaWYgKGVuYWJsZWQpIHsKKwkJYWxpX3dyaXRlKDB4NjAsIGlvID4+IDgpOworCQlhbGlfd3JpdGUoMHg2MSwgaW8gJiAweGZmKTsKKwkJYWxpX3dyaXRlKDB4NzAsIGlycSk7CisJCQorCQlhbGlfd3JpdGUoMHhmMCwgMHgwMCk7CisJCWFsaV93cml0ZSgweGYxLCAweDAwKTsKKwkJCisJCS8qIGh1aD8gd3JpdGUgMHhmMiB0d2ljZSAtIGEgdHlwbyBpbiByb2xvCisJCSAqIG9yIHNvbWUgc2VjcmV0IGFsaSBlcnJhdGE/IFdobyBrbm93cz8gCisJCSAqLworCQlpZiAoaW5kZXgpIHsKKwkJCWFsaV93cml0ZSgweGYyLCAweDAwKTsKKwkJfQorCQlhbGlfd3JpdGUoMHhmMiwgMHgwYyk7CisJfQorCUFMSV9DTE9TRSgpOworCit9CisKK3ZvaWQgYWxpNTEyeF9zZXRfdWFydDJfaXJkYShpbnQgZW5hYmxlZCkKK3sKKwlBTElfT1BFTigpOworCUFMSV9TRUxERVYoNSk7CisJCisJYWxpX3dyaXRlKDB4ZjEsIGVuYWJsZWQ/MHg0ODoweDAwKTsgLyogZnVsbGR1cGxleCBJckRhICovCisJQUxJX0NMT1NFKCk7CisKK30KKwordm9pZCBhbGk1MTJ4X3NldF9ydGMoaW50IGVuYWJsZWQsIHUxNiBpbywgdTggaXJxKQoreworCUFMSV9PUEVOKCk7CisJQUxJX1NFTERFVig2KTsKKwkKKwlhbGlfd3JpdGUoMHgzMCwgZW5hYmxlZD8xOjApOworCWlmIChlbmFibGVkKSB7CisJCWFsaV93cml0ZSgweDYwLCBpbyA+PiA4KTsKKwkJYWxpX3dyaXRlKDB4NjEsIGlvICYgMHhmZik7CisJCWFsaV93cml0ZSgweDcwLCBpcnEpOworCisJCWFsaV93cml0ZSgweGYwLCAweDAwKTsKKwl9CisJQUxJX0NMT1NFKCk7Cit9CisKK3ZvaWQgYWxpNTEyeF9zZXRfa2JjKGludCBlbmFibGVkLCB1OCBrYmNfaXJxLCB1OCBtb3VzZV9pcnEpCit7CisJQUxJX09QRU4oKTsKKwlBTElfU0VMREVWKDcpOworCQorCWFsaV93cml0ZSgweDMwLCBlbmFibGVkPzE6MCk7CisJaWYgKGVuYWJsZWQpIHsKKwkJYWxpX3dyaXRlKDB4NzAsIGtiY19pcnEpOworCQlhbGlfd3JpdGUoMHg3MiwgbW91c2VfaXJxKTsJCQorCQkKKwkJYWxpX3dyaXRlKDB4ZjAsIDB4MDApOworCX0KKwlBTElfQ0xPU0UoKTsKK30KKworCisvKiBDb21tb24gSS9PCisgKiAKKyAqIChUaGlzIGRlc2NyaXBvdHNpb24gaXMgYmFzZSBvbiBzZXZlcmFsIGluY29tcGV0ZSBzb3VyY2VzCisgKiAgc2luY2UgSSBoYXZlIG5vdCBiZWVuIGFibGUgdG8gb2J0YWluIGFueSBkYXRhc2hlZXQgZm9yIHRoZSBkZXZpY2UKKyAqICB0aGVyZSBtYXkgYmUgc29tZSBtaXMtdW5kZXJzdGFuZGluZ3MgYnVycmllZCBpbiBoZXJlLiAKKyAqICAtLSBEYW5pZWwgZGFuaWVsQG9taWNyb24uc2UpCisgKiAKKyAqIFRoZXJlIGFyZSAyMiBDSU8gcGlucyBudW1iZXJlZAorICogMTAtMTcKKyAqIDIwLTI1CisgKiAzMC0zNworICogCisgKiAyMC0yNCBhcmUgZGVkaWNhdGVkIENJTyBwaW5zLCB0aGUgb3RoZXIgMTcgYXJlIG11bGlwbGV4ZWQgd2l0aAorICogb3RoZXIgZnVuY3Rpb25zLgorICogCisgKiAgICAgICAgICAgU2Vjb25kYXJ5IAorICogQ0lPIFBpbiAgIEZ1bmN0aW9uICAgIERlY3JpcHRpb24KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENJTzEwICAgICBJUlFJTjEgICAgICBJbnRlcnJ1cHQgaW5wdXQgMT8KKyAqIENJTzExICAgICBJUlFJTjIgICAgICBJbnRlcnJ1cHQgaW5wdXQgMj8KKyAqIENJTzEyICAgICBJUlJYICAgICAgICBJckRhIFJlY2VpdmUKKyAqIENJTzEzICAgICBJUlRYICAgICAgICBJckRhIFRyYW5zbWl0CisgKiBDSU8xNCAgICAgUDIxICAgICAgICAgS0JDIFAyMSBmdWNudGlvbgorICogQ0lPMTUgICAgIFAyMCAgICAgICAgIEtCQyBQMjEgZnVjbnRpb24KKyAqIENJTzE2ICAgICBJMkNfQ0xLICAgICBJMkMgQ2xvY2sKKyAqIENJTzE3ICAgICBJMkNfREFUICAgICBJMkMgRGF0YQorICogCisgKiBDSU8yMCAgICAgLQorICogQ0lPMjEgICAgIC0KKyAqIENJTzIyICAgICAtCisgKiBDSU8yMyAgICAgLQorICogQ0lPMjQgICAgIC0KKyAqIENJTzI1ICAgICBMT0NLICAgICAgICBLZXlsb2NrCisgKiAKKyAqIENJTzMwICAgICBLQkNfQ0xLICAgICBLZXliYW9yZCBDbG9jaworICogQ0lPMzEgICAgIENTMEogICAgICAgIEdlbmVyYWwgQ2hpcCBTZWxlY3QgZGVjb2RlciBDUzBKCisgKiBDSU8zMiAgICAgQ1MxSiAgICAgICAgR2VuZXJhbCBDaGlwIFNlbGVjdCBkZWNvZGVyIENTMUoKKyAqIENJTzMzICAgICBBTFRfS0NMSyAgICBBbHRlcm5hdGl2ZSBLZXlib2FyZCBDbG9jaworICogQ0lPMzQgICAgIEFMVF9LREFUICAgIEFsdGVybmF0aXZlIEtleWJvYXJkIERhdGEKKyAqIENJTzM1ICAgICBBTFRfTUNMSyAgICBBbHRlcm5hdGl2ZSBNb3VzZSBDbG9jaworICogQ0lPMzYgICAgIEFMVF9NREFUICAgIEFsdGVybmF0aXZlIE1vdXNlIERhdGEKKyAqIENJTzM3ICAgICBBTFRfS0JDICAgICBBbHRlcm5hdGl2ZSBLQkMgc2VsZWN0CisgKgorICogVGhlIENJTyB1c2UgYSBkb3VibGUgaW5kaXJlY3QgYWRkcmVzcyBzY2hlbWUuIAorICogCisgKiBSZWlnc3RlciAzIGluIHRoZSBTSU8gaXMgdXNlZCB0byBzZWxlY3RnIHdoZXJlIHRoZSBDSU8gCisgKiBJL08gcmVnaXN0ZXJzIHNob3cgdXAgdW5kZXIgZnVuY3Rpb24gOC4gTm90ZSB0aGF0IHRoZXNlCisgKiByZWdpc3RlcnMgY2xhc2ggd2l0aCB0aGUgQ0lPIGZ1bmN0aW9uIHNlbGVjdCByZWdzdGVycywKKyAqIGJlbG93LgorICogCisgKiBTSU8gcmVpZ3N0ZXIgMyAoQ0lPIEFkZHJlc3MgU2VsZWN0aW9uKSBiaXQgZGVmaW5pdGlvbnM6CisgKiBiaXQgNyAgIENJTyBkYXRhIHJlZ2lzdGVyIGVuYWJsZWQKKyAqIGJpdCAxLTAgQ0lPIGluZGlyZWN0IHJlZ2lzdGVycyBzZWxlY3QKKyAqICAgICAJIDAgIGluZGV4ID0gMHhFMCBkYXRhID0gMHhFMQorICogICAgICAgMSAgaW5kZXggPSAweEUyIGRhdGEgPSAweEUzCisgKiAgICAgICAyICBpbmRleCA9IDB4RTQgZGF0YSA9IDB4RTUKKyAqICAgICAgIDMgIGluZGV4ID0gMHhFQSBkYXRhID0gMHhFQgorICogCisgKiBUaGVyZSBhcmUgdGhyZWUgQ0lPIEkvTyByZWdpc3RlciBhY2Nlc3NlZCB2aWEgQ0lPIGluZGV4IGFuZCBDSU8gZGF0YQorICogMHgwMSAgICAgQ0lPIDEwLTE3IGRhdGEKKyAqIDB4MDIgICAgIENJTyAyMC0yNSBkYXRhIChiaXRzIDctNiB1bnVzZWQpCisgKiAweDAzICAgICBDSU8gMzAtMzcgZGF0YQorICogCisgKiAKKyAqIFRoZSBwaW4gZnVuY3Rpb24gaXMgYWNjZXNzZWQgdGhyb3VnaCBub3JtYWwgCisgKiBTSU8gcmVnaXN0ZXJzLCBlYWNoIHJlZ2lzdGVyIGhhdmUgdGhlIHNhbWUgZm9ybWF0OgorICogCisgKiBCaXQgICBGdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgIFZhbHVlCisgKiAwICAgICBJbnB1dC9vdXRwdXQgICAgICAgICAgICAgICAgIDE9aW5wdXQgCisgKiAxICAgICBQb2xhcml0eSBvZiBzaWduYWwgICAgICAgICAgIDE9aW52ZXJ0ZWQKKyAqIDIgICAgIFVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgPz8KKyAqIDMgICAgIEZ1bmN0aW9uIChub3JtYWwgb3Igc3BlY2lhbCkgMT1zcGVjaWFsCisgKiA3LTQgICBVbnVzZWQKKyAqIAorICogU0lPIFJFRworICogMHhlMCAgICAgQ0lPIDEwIENvbmZpZworICogMHhlMSAgICAgQ0lPIDExIENvbmZpZworICogMHhlMiAgICAgQ0lPIDEyIENvbmZpZworICogMHhlMyAgICAgQ0lPIDEzIENvbmZpZworICogMHhlNCAgICAgQ0lPIDE0IENvbmZpZworICogMHhlNSAgICAgQ0lPIDE1IENvbmZpZworICogMHhlNiAgICAgQ0lPIDE2IENvbmZpZworICogMHhlNyAgICAgQ0lPIDE2IENvbmZpZworICoKKyAqIDB4ZTggICAgIENJTyAyMCBDb25maWcKKyAqIDB4ZTkgICAgIENJTyAyMSBDb25maWcKKyAqIDB4ZWEgICAgIENJTyAyMiBDb25maWcKKyAqIDB4ZWIgICAgIENJTyAyMyBDb25maWcKKyAqIDB4ZWMgICAgIENJTyAyNCBDb25maWcKKyAqIDB4ZWQgICAgIENJTyAyNSBDb25maWcKKyAqCisgKiAweGY1ICAgICBDSU8gMzAgQ29uZmlnCisgKiAweGY2ICAgICBDSU8gMzEgQ29uZmlnCisgKiAweGY3ICAgICBDSU8gMzIgQ29uZmlnCisgKiAweGY4ICAgICBDSU8gMzMgQ29uZmlnCisgKiAweGY5ICAgICBDSU8gMzQgQ29uZmlnCisgKiAweGZhICAgICBDSU8gMzUgQ29uZmlnCisgKiAweGZiICAgICBDSU8gMzYgQ29uZmlnCisgKiAweGZjICAgICBDSU8gMzcgQ29uZmlnCisgKiAKKyAqLworCit2b2lkIGFsaTUxMnhfc2V0X2NpbyhpbnQgZW5hYmxlZCkKK3sKKwlpbnQgaTsKKwkKKwlBTElfT1BFTigpOworCWFsaV93cml0ZSgweDMsIDMpOyAgICAvKiBEaXNhYmxlIENJTyBkYXRhIHJlZ2lzdGVyICovCisJCisJQUxJX1NFTERFVig4KTsKKwlhbGlfd3JpdGUoMHgzMCwgZW5hYmxlZD8xOjApOworCQorCS8qIHNldCBhbGwgcGlucyB0byBpbnB1dCB0byBzdGFydCB3aXRoICovCisJZm9yIChpPTB4ZTA7aTwweGVlO2krKykgeworCQlhbGlfd3JpdGUoaSwgMSk7CisJfQorCWZvciAoaT0weGY1O2k8MHhmZTtpKyspIHsKKwkJYWxpX3dyaXRlKGksIDEpOworCX0KKwkJCQorCUFMSV9DTE9TRSgpOworfQorCit2b2lkIGFsaTUxMnhfY2lvX2Z1bmN0aW9uKGludCBwaW4sIGludCBzcGVjaWFsLCBpbnQgaW52LCBpbnQgaW5wdXQpCit7CisJdTggZGF0YTsKKwl1OCBhZGRyOworCQorCQorCS8qIHZhbGlkIHBpbnMgYXJlIDEwLTE3LCAyMC0yNSBhbmQgMzAtMzcgKi8KKwlpZiAocGluID49IDEwICYmIHBpbiA8PSAxNykgeyAKKwkJYWRkciA9IDB4ZTArKHBpbi0xMCk7CisJfSBlbHNlIGlmIChwaW4gPj0gMjAgJiYgcGluIDw9IDI1KSB7CisJCWFkZHIgPSAweGU4KyhwaW4tMjApOworCX0gZWxzZSBpZiAocGluID49IDMwICYmIHBpbiA8PSAzNykgeyAKKwkJYWRkciA9IDB4ZjUrKHBpbi0zMCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuOworCX0KKwkKKwlBTElfT1BFTigpOworCUFMSV9TRUxERVYoOCk7CisJCisJYWxpX3dyaXRlKDB4MDMsIDB4MDMpOyAgICAvKiBEaXNhYmxlIENJTyBkYXRhIHJlZ2lzdGVyICovCisJCisJZGF0YT0wOworCWlmIChzcGVjaWFsKSB7CisJCWRhdGEgfD0gMHgwODsKKwl9IGVsc2UgeworCQlpZiAoaW52KSB7CisJCQlkYXRhIHw9IDB4MDI7CisJCX0KKwkJaWYgKGlucHV0KSB7CisJCQlkYXRhIHw9IDB4MDE7CisJCX0KKwl9CisJCisJYWxpX3dyaXRlKGFkZHIsIGRhdGEpOworCQorCUFMSV9DTE9TRSgpOworfQorCit2b2lkIGFsaTUxMnhfY2lvX291dChpbnQgcGluLCBpbnQgdmFsdWUpIAoreworCXU4IHJlZzsKKwl1OCBkYXRhOworCXU4IGJpdDsKKwkKKwkvKiB2YWxpZCBwaW5zIGFyZSAxMC0xNywgMjAtMjUgYW5kIDMwLTM3ICovCisJaWYgKHBpbiA+PSAxMCAmJiBwaW4gPD0gMTcpIHsgCisJCXJlZyA9IDE7CisJCXBpbiAtPSAxMDsKKwl9IGVsc2UgaWYgKHBpbiA+PSAyMCAmJiBwaW4gPD0gMjUpIHsKKwkJcmVnID0gMjsKKwkJcGluIC09IDIwOworCX0gZWxzZSBpZiAocGluID49IDMwICYmIHBpbiA8PSAzNykgeyAKKwkJcmVnID0gMzsKKwkJcGluIC09IDMwOworCX0gZWxzZSB7CisJCXJldHVybjsKKwl9CisJYml0ID0gMSA8PCBwaW47CisJCisJQUxJX09QRU4oKTsKKwlBTElfU0VMREVWKDgpOworCQorCWFsaV93cml0ZSgweDAzLCAweDgzKTsgICAgLyogRW5hYmxlIENJTyBkYXRhIHJlZ2lzdGVyLCB1c2UgZGF0YSBwb3J0IGF0IDB4ZWEgKi8KKwkKKwlhbGlfd3JpdGUoMHhlYSwgcmVnKTsgICAgIC8qIHNlbGVjdCBJL08gcmVnaXN0ZXIgKi8KKwlkYXRhID0gYWxpX3JlYWQoMHhlYik7CisJaWYgKHZhbHVlKSB7CisJCWRhdGEgfD0gYml0OworCX0gZWxzZSB7CisJCWRhdGEgJj0gfmJpdDsKKwl9CisJYWxpX3dyaXRlKDB4ZWIsIGRhdGEpOworCWFsaV93cml0ZSgweGVhLCAwKTsgICAgICAgLyogc2VsZWN0IHJlZ2lzdGVyIDAgKi8KKwlhbGlfd3JpdGUoMHgwMywgMHgwMyk7ICAgIC8qIERpc2FibGUgQ0lPIGRhdGEgcmVnaXN0ZXIgKi8KKwlBTElfQ0xPU0UoKTsKK30KKworaW50IGFsaTUxMnhfY2lvX2luKGludCBwaW4pCit7CisJdTggcmVnOworCXU4IGRhdGE7CisJdTggYml0OworCQorCS8qIHZhbGlkIHBpbnMgYXJlIDEwLTE3LCAyMC0yNSBhbmQgMzAtMzcgKi8KKwlpZiAocGluID49IDEwICYmIHBpbiA8PSAxNykgeyAKKwkJcmVnID0gMTsKKwkJcGluIC09IDEwOworCX0gZWxzZSBpZiAocGluID49IDIwICYmIHBpbiA8PSAyNSkgeworCQlyZWcgPSAyOworCQlwaW4gLT0gMjA7CisJfSBlbHNlIGlmIChwaW4gPj0gMzAgJiYgcGluIDw9IDM3KSB7IAorCQlyZWcgPSAzOworCQlwaW4gLT0gMzA7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC0xOyAKKwl9CisJYml0ID0gMSA8PCBwaW47CisJCisJQUxJX09QRU4oKTsKKwlBTElfU0VMREVWKDgpOworCQorCWFsaV93cml0ZSgweDAzLCAweDgzKTsgICAgLyogRW5hYmxlIENJTyBkYXRhIHJlZ2lzdGVyLCB1c2UgZGF0YSBwb3J0IGF0IDB4ZWEgKi8KKwkKKwlhbGlfd3JpdGUoMHhlYSwgcmVnKTsgICAgIC8qIHNlbGVjdCBJL08gcmVnaXN0ZXIgKi8KKwlkYXRhID0gYWxpX3JlYWQoMHhlYik7CisJYWxpX3dyaXRlKDB4ZWEsIDApOyAgICAgICAvKiBzZWxlY3QgcmVnaXN0ZXIgMCAqLworCWFsaV93cml0ZSgweDAzLCAweDAzKTsgICAgLyogRGlzYWJsZSBDSU8gZGF0YSByZWdpc3RlciAqLworCUFMSV9DTE9TRSgpOworCQorCXJldHVybiBkYXRhICYgYml0OyAKK30KKworIApkaWZmIC0tZ2l0IGEvbGliX2kzODYvaWMvc2M1MjAuYyBiL2xpYl9pMzg2L2ljL3NjNTIwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIwMjYyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYl9pMzg2L2ljL3NjNTIwLmMKQEAgLTAsMCArMSwzNDggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyogc3R1ZmYgc3BlY2lmaWMgZm9yIHRoZSBzYzUyMCwKKyAqIGJ1dCBpZGVwZW5kZW50IG9mIGltcGxlbWVudGF0aW9uICovCisKKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHBjaS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wY2kuaD4KKyNpbmNsdWRlIDxhc20vaWMvc2M1MjAuaD4KKworLyogCisgKiB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgYm9hcmRzIGJhc2VkIG9uIHRoZSBBTUQgc2M1MjAgCisgKiAKKyAqIHZvaWQgd3JpdGVfbW1jcl9ieXRlKHUxNiBtbWNyLCB1OCBkYXRhKQorICogdm9pZCB3cml0ZV9tbWNyX3dvcmQodTE2IG1tY3IsIHUxNiBkYXRhKQorICogdm9pZCB3cml0ZV9tbWNyX2xvbmcodTE2IG1tY3IsIHUzMiBkYXRhKQorICogCisgKiB1OCAgIHJlYWRfbW1jcl9ieXRlKHUxNiBtbWNyKQorICogdTE2ICByZWFkX21tY3Jfd29yZCh1MTYgbW1jcikKKyAqIHUzMiAgcmVhZF9tbWNyX2xvbmcodTE2IG1tY3IpCisgKiAKKyAqIHZvaWQgaW5pdF9zYzUyMCh2b2lkKQorICogdW5zaWduZWQgbG9uZyBpbml0X3NjNTIwX2RyYW0odm9pZCkKKyAqIHZvaWQgcGNpX3NjNTIwX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQorICogCisgKiB2b2lkIHJlc2V0X3RpbWVyKHZvaWQpCisgKiB1bG9uZyBnZXRfdGltZXIodWxvbmcgYmFzZSkKKyAqIHZvaWQgc2V0X3RpbWVyKHVsb25nIHQpCisgKiB2b2lkIHVkZWxheSh1bnNpZ25lZCBsb25nIHVzZWMpCisgKiAKKyAqLworCitzdGF0aWMgdTMyIG1tY3JfYmFzZT0gMHhmZmZlZjAwMDsKKwordm9pZCB3cml0ZV9tbWNyX2J5dGUodTE2IG1tY3IsIHU4IGRhdGEpCit7CisJd3JpdGViKGRhdGEsIG1tY3IrbW1jcl9iYXNlKTsKK30KKwordm9pZCB3cml0ZV9tbWNyX3dvcmQodTE2IG1tY3IsIHUxNiBkYXRhKQoreworCXdyaXRldyhkYXRhLCBtbWNyK21tY3JfYmFzZSk7CQorfQorCit2b2lkIHdyaXRlX21tY3JfbG9uZyh1MTYgbW1jciwgdTMyIGRhdGEpCit7CisJd3JpdGVsKGRhdGEsIG1tY3IrbW1jcl9iYXNlKTsKK30KKwordTggcmVhZF9tbWNyX2J5dGUodTE2IG1tY3IpCit7CisJcmV0dXJuIHJlYWRiKG1tY3IrbW1jcl9iYXNlKTsKK30KKwordTE2IHJlYWRfbW1jcl93b3JkKHUxNiBtbWNyKQoreworCXJldHVybiByZWFkdyhtbWNyK21tY3JfYmFzZSk7CQorfQorCit1MzIgcmVhZF9tbWNyX2xvbmcodTE2IG1tY3IpCit7CisJcmV0dXJuIHJlYWRsKG1tY3IrbW1jcl9iYXNlKTsKK30KKworCit2b2lkIGluaXRfc2M1MjAodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKwkKKwkvKiBTZXQgdGhlIFVBUlR4Q1RMIHJlZ2lzdGVyIGF0IGl0J3Mgc2xvd2VyLAorCSAqIGJhdWQgY2xvY2sgZ2l2aW5nIHVzIGEgMS44NDMyIE1IeiByZWZlcmVuY2UgCisJICovCisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1VBUlQxQ1RMLCA3KTsKKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfVUFSVDJDVEwsIDcpOworCQorCS8qIGZpcnN0IHNldCB0aGUgdGltZXIgcGluIG1hcHBpbmcgKi8KKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQ0xLU0VMLCAweDcyKTsJLyogbm8gY2xvY2sgZnJlcXVlbmN5IHNlbGVjdGVkLCB1c2UgMS4xODkyTUh6ICovCisJCisJLyogZW5hYmxlIFBDSSBidXMgYXJiaXRyZXIgKi8KKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU1lTQVJCQ1RMLDB4MDIpOyAgLyogZW5hYmxlIGNvbmN1cnJlbnQgbW9kZSAqLworCQorCXdyaXRlX21tY3Jfd29yZChTQzUyMF9TWVNBUkJNRU5CLDB4MWYpOyAvKiBlbmFibGUgZXh0ZXJuYWwgZ3JhbnRzICovCisJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0hCQ1RMLDB4MDQpOyAgICAgIC8qIGVuYWJsZSBwb3N0ZWQtd3JpdGVzICovCisKKworCWlmIChDRkdfU0M1MjBfSElHSF9TUEVFRCkgeworCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQ1BVQ1RMLCAweDIpOwkvKiBzZXQgaXQgdG8gMTMzIE1IeiBhbmQgd3JpdGUgYmFjayAqLworCQlnZC0+Y3B1X2NsayA9IDEzMzAwMDAwMDsKKwkJcHJpbnRmKCIjIyBDUFUgU3BlZWQgc2V0IHRvIDEzM01IelxuIik7CisJfSBlbHNlIHsKKwkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0NQVUNUTCwgMSk7CS8qIHNldCBDUFUgdG8gMTAwIE1IeiBhbmQgd3JpdGUgYmFjayBjYWNoZSAqLworCQlwcmludGYoIiMjIENQVSBTcGVlZCBzZXQgdG8gMTAwTUh6XG4iKTsKKwkJZ2QtPmNwdV9jbGsgPSAxMDAwMDAwMDA7CisJfQorCQorCisJLyogd2FpdCBhdCBsZWFzdCBvbmUgbWlsbGlzZWNvbmQgKi8KKyAgICAgICAgYXNtKCJtb3ZsCSQweDIwMDAsJSVlY3hcbiIKKwkgICAgIndhaXRfbG9vcDoJcHVzaGwgJSVlY3hcbiIKKwkgICAgInBvcGwJJSVlY3hcbiIKKwkgICAgImxvb3Agd2FpdF9sb29wXG4iOiA6IDogImVjeCIpOworCisJLyogdHVybiBvbiB0aGUgU0RSQU0gd3JpdGUgYnVmZmVyICovCisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0RCQ1RMLCAweDExKTsKKworCS8qIHR1cm4gb24gdGhlIGNhY2hlIGFuZCBkaXNhYmxlIHdyaXRlIHRocm91Z2ggKi8KKwlhc20oIm1vdmwJJSVjcjAsICUlZWF4XG4iCisJICAgICJhbmRsCSQweDlmZmZmZmZmLCAlJWVheFxuIgorCSAgICAibW92bAklJWVheCwgJSVjcjBcbiIgIDogOiA6ICJlYXgiKTsKK30KKwordW5zaWduZWQgbG9uZyBpbml0X3NjNTIwX2RyYW0odm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKwliZF90ICpiZCA9IGdkLT5iZDsKKwkKKwl1MzIgZHJhbV9wcmVzZW50PTA7CisJdTMyIGRyYW1fY3RybDsKKworCWludCB2YWw7CisJCisJaW50IGNhc19wcmVjaGFyZ2VfZGVsYXkgPSBDRkdfU0RSQU1fUFJFQ0hBUkdFX0RFTEFZOwkKKwlpbnQgcmVmcmVzaF9yYXRlICAgICAgICA9IENGR19TRFJBTV9SRUZSRVNIX1JBVEU7CQorCWludCByYXNfY2FzX2RlbGF5ICAgICAgID0gQ0ZHX1NEUkFNX1JBU19DQVNfREVMQVk7CisJCisJLyogc2V0IFNEUkFNIHNwZWVkIGhlcmUgKi8KKwkKKwlyZWZyZXNoX3JhdGUvPTc4OwkKKwlpZiAocmVmcmVzaF9yYXRlPD0xKSB7CisJCXZhbCA9IDA7ICAvKiA3Ljh1cyAqLworCX0gZWxzZSBpZiAocmVmcmVzaF9yYXRlPT0yKSB7CisJCXZhbCA9IDE7ICAvKiAxNS42dXMgKi8KKwl9IGVsc2UgaWYgKHJlZnJlc2hfcmF0ZT09MyB8fCByZWZyZXNoX3JhdGU9PTQpIHsKKwkJdmFsID0gMjsgIC8qIDMxLjJ1cyAqLworCX0gZWxzZSB7CisJCXZhbCA9IDM7ICAvKiA2Mi40dXMgKi8KKwl9CisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0RSQ0NUTCwgKHJlYWRfbW1jcl9ieXRlKFNDNTIwX0RSQ0NUTCkgJiAweGNmKSB8ICh2YWw8PDQpKTsKKwkKKwl2YWwgPSByZWFkX21tY3JfYnl0ZShTQzUyMF9EUkNUTUNUTCk7CisJdmFsICY9IDB4ZjA7CisJCisJaWYgKGNhc19wcmVjaGFyZ2VfZGVsYXk9PTMpIHsJCQorCQl2YWwgfD0gMHgwNDsgICAvKiAzVCAqLworCX0gZWxzZSBpZiAoY2FzX3ByZWNoYXJnZV9kZWxheT09NCkgewkJCisJCXZhbCB8PSAweDA4OyAgIC8qIDRUICovCisJfSBlbHNlIGlmIChjYXNfcHJlY2hhcmdlX2RlbGF5PjQpIHsJCQorCQl2YWwgfD0gMHgwYzsKKwl9IAorCQorCWlmIChyYXNfY2FzX2RlbGF5ID4gMykgeworCQl2YWwgfD0gMjsgCisJfSBlbHNlIHsKKwkJdmFsIHw9IDE7IAorCX0KKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfRFJDVE1DVEwsIHZhbCk7CisKKworCS8qIFdlIHJlYWQtYmFjayB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgZHJhbQorCSAqIGNvbnRyb2xsZXIgdGhhdCB0aGUgYXNzZW1ibHkgY29kZSB3cm90ZSAqLworCWRyYW1fY3RybCA9IHJlYWRfbW1jcl9sb25nKFNDNTIwX0RSQ0JFTkRBRFIpOworCQorCisJYmQtPmJpX2RyYW1bMF0uc3RhcnQgPSAwOworCWlmIChkcmFtX2N0cmwgJiAweDgwKSB7CisJCS8qIGJhbmsgMCBlbmFibGVkICovCisJCWRyYW1fcHJlc2VudCA9IGJkLT5iaV9kcmFtWzFdLnN0YXJ0ID0gKGRyYW1fY3RybCAmIDB4N2YpIDw8IDIyOworCQliZC0+YmlfZHJhbVswXS5zaXplID0gYmQtPmJpX2RyYW1bMV0uc3RhcnQ7IAorCisJfSBlbHNlIHsKKwkJYmQtPmJpX2RyYW1bMF0uc2l6ZSA9IDA7CisJCWJkLT5iaV9kcmFtWzFdLnN0YXJ0ID0gYmQtPmJpX2RyYW1bMF0uc3RhcnQ7CisJfQorCQorCWlmIChkcmFtX2N0cmwgJiAweDgwMDApIHsKKwkJLyogYmFuayAxIGVuYWJsZWQgKi8KKwkJZHJhbV9wcmVzZW50ID0gYmQtPmJpX2RyYW1bMl0uc3RhcnQgPSAoZHJhbV9jdHJsICYgMHg3ZjAwKSA8PCAxNDsKKwkJYmQtPmJpX2RyYW1bMV0uc2l6ZSA9IGJkLT5iaV9kcmFtWzJdLnN0YXJ0IC0gIGJkLT5iaV9kcmFtWzFdLnN0YXJ0OyAKKwl9IGVsc2UgeworCQliZC0+YmlfZHJhbVsxXS5zaXplID0gMDsKKwkJYmQtPmJpX2RyYW1bMl0uc3RhcnQgPSBiZC0+YmlfZHJhbVsxXS5zdGFydDsKKwl9CisJCisJaWYgKGRyYW1fY3RybCAmIDB4ODAwMDAwKSB7CisJCS8qIGJhbmsgMiBlbmFibGVkICovCisJCWRyYW1fcHJlc2VudCA9IGJkLT5iaV9kcmFtWzNdLnN0YXJ0ID0gKGRyYW1fY3RybCAmIDB4N2YwMDAwKSA8PCA2OworCQliZC0+YmlfZHJhbVsyXS5zaXplID0gYmQtPmJpX2RyYW1bM10uc3RhcnQgLSAgYmQtPmJpX2RyYW1bMl0uc3RhcnQ7IAorCX0gZWxzZSB7CisJCWJkLT5iaV9kcmFtWzJdLnNpemUgPSAwOworCQliZC0+YmlfZHJhbVszXS5zdGFydCA9IGJkLT5iaV9kcmFtWzJdLnN0YXJ0OworCX0gCisJCisJaWYgKGRyYW1fY3RybCAmIDB4ODAwMDAwMDApIHsKKwkJLyogYmFuayAzIGVuYWJsZWQgKi8KKwkJZHJhbV9wcmVzZW50ICA9IChkcmFtX2N0cmwgJiAweDdmMDAwMDAwKSA+PiAyOworCQliZC0+YmlfZHJhbVszXS5zaXplID0gZHJhbV9wcmVzZW50IC0gIGJkLT5iaV9kcmFtWzNdLnN0YXJ0OworCX0gZWxzZSB7CisJCWJkLT5iaV9kcmFtWzNdLnNpemUgPSAwOworCX0KKworCQorI2lmIDAJCisJcHJpbnRmKCJDb25maWd1cmVkICVkIGJ5dGVzIG9mIGRyYW1cbiIsIGRyYW1fcHJlc2VudCk7CisjZW5kaWYJCisJZ2QtPnJhbV9zaXplID0gZHJhbV9wcmVzZW50OworCQorCXJldHVybiBkcmFtX3ByZXNlbnQ7Cit9CisKKworI2lmZGVmIENPTkZJR19QQ0kKKworCisKK3ZvaWQgcGNpX3NjNTIwX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworCWhvc2UtPmZpcnN0X2J1c25vID0gMDsKKwlob3NlLT5sYXN0X2J1c25vID0gMHhmZjsKKworCS8qIFN5c3RlbSBtZW1vcnkgc3BhY2UgKi8KKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMCwgCisJCSAgICAgICBTQzUyMF9QQ0lfTUVNT1JZX0JVUywKKwkJICAgICAgIFNDNTIwX1BDSV9NRU1PUllfUEhZUywKKwkJICAgICAgIFNDNTIwX1BDSV9NRU1PUllfU0laRSwKKwkJICAgICAgIFBDSV9SRUdJT05fTUVNIHwgUENJX1JFR0lPTl9NRU1PUlkpOworCisJLyogUENJIG1lbW9yeSBzcGFjZSAqLworCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAxLCAKKwkJICAgICAgIFNDNTIwX1BDSV9NRU1fQlVTLAorCQkgICAgICAgU0M1MjBfUENJX01FTV9QSFlTLAorCQkgICAgICAgU0M1MjBfUENJX01FTV9TSVpFLAorCQkgICAgICAgUENJX1JFR0lPTl9NRU0pOworCisJLyogSVNBL1BDSSBtZW1vcnkgc3BhY2UgKi8KKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMiwgCisJCSAgICAgICBTQzUyMF9JU0FfTUVNX0JVUywKKwkJICAgICAgIFNDNTIwX0lTQV9NRU1fUEhZUywKKwkJICAgICAgIFNDNTIwX0lTQV9NRU1fU0laRSwKKwkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKKworCS8qIFBDSSBJL08gc3BhY2UgKi8KKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMywgCisJCSAgICAgICBTQzUyMF9QQ0lfSU9fQlVTLAorCQkgICAgICAgU0M1MjBfUENJX0lPX1BIWVMsCisJCSAgICAgICBTQzUyMF9QQ0lfSU9fU0laRSwKKwkJICAgICAgIFBDSV9SRUdJT05fSU8pOworCisJLyogSVNBL1BDSSBJL08gc3BhY2UgKi8KKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgNCwgCisJCSAgICAgICBTQzUyMF9JU0FfSU9fQlVTLAorCQkgICAgICAgU0M1MjBfSVNBX0lPX1BIWVMsCisJCSAgICAgICBTQzUyMF9JU0FfSU9fU0laRSwKKwkJICAgICAgIFBDSV9SRUdJT05fSU8pOworCisJaG9zZS0+cmVnaW9uX2NvdW50ID0gNTsKKworCXBjaV9zZXR1cF90eXBlMShob3NlLAorCQkJU0M1MjBfUkVHX0FERFIsCisJCQlTQzUyMF9SRUdfREFUQSk7CisKKwlwY2lfcmVnaXN0ZXJfaG9zZShob3NlKTsKKworCWhvc2UtPmxhc3RfYnVzbm8gPSBwY2lfaG9zZV9zY2FuKGhvc2UpOworCQorCS8qIGVuYWJsZSB0YXJnZXQgbWVtb3J5IGFjY2VzZXMgb24gaG9zdCBicmlnZSAqLworCXBjaV93cml0ZV9jb25maWdfd29yZCgwLCBQQ0lfQ09NTUFORCwgCisJCQkgICAgICBQQ0lfQ09NTUFORF9NRU1PUlkgfCBQQ0lfQ09NTUFORF9NQVNURVIpOworCit9CisKKworI2VuZGlmCisKKyNpZmRlZiBDRkdfVElNRVJfU0M1MjAKKworCit2b2lkIHJlc2V0X3RpbWVyKHZvaWQpCit7CisJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0dQVE1SMENOVCwgMCk7CisJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0dQVE1SMENUTCwgMHg2MDAxKTsKKwkKK30KKwordWxvbmcgZ2V0X3RpbWVyKHVsb25nIGJhc2UpCit7CisJLyogZml4bWU6IDMwIG9yIDMzICovCisJcmV0dXJuIAlyZWFkX21tY3Jfd29yZChTQzUyMF9HUFRNUjBDTlQpIC8gMzM7Cit9CisKK3ZvaWQgc2V0X3RpbWVyKHVsb25nIHQpCit7CisJLyogRml4TWU6IHVzZSB0d28gY2FzY2FkZSBjb3VwbGVkIHRpbWVycyAqLworCXdyaXRlX21tY3Jfd29yZChTQzUyMF9HUFRNUjBDVEwsIDB4NDAwMSk7CisJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0dQVE1SMENOVCwgdCozMyk7CisJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0dQVE1SMENUTCwgMHg2MDAxKTsKK30KKworCit2b2lkIHVkZWxheSh1bnNpZ25lZCBsb25nIHVzZWMpCit7CisJaW50IG09MDsKKwlsb25nIHU7CisJCisJcmVhZF9tbWNyX3dvcmQoU0M1MjBfU1dUTVJNSUxMSSk7CisJcmVhZF9tbWNyX3dvcmQoU0M1MjBfU1dUTVJNSUNSTyk7CisJICAgICAKKyNpZiAwCisJLyogZG8gbm90IGVuYWJsZSB0aGlzIGxpbmUsIHVkZWxheSBpcyB1c2VkIGluIHRoZSBzZXJpYWwgZHJpdmVyIC0+IHJlY3Vyc2lvbiAqLworCXByaW50ZigidWRlbGF5OiAlbGQgbS51ICVkLiVkICB0bS50dSAlZC4lZFxuIiwgdXNlYywgbSwgdSwgdG0sIHR1KTsKKyNlbmRpZgkKKwl3aGlsZSAoMSkgeworCQkKKwkJbSArPSByZWFkX21tY3Jfd29yZChTQzUyMF9TV1RNUk1JTExJKTsKKwkJdSA9IHJlYWRfbW1jcl93b3JkKFNDNTIwX1NXVE1STUlDUk8pICsgKG0gKiAxMDAwKTsKKwkJCisJCWlmICh1c2VjIDw9IHUpIHsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9saWJfaTM4Ni9pYy9zYzUyMF9hc20uUyBiL2xpYl9pMzg2L2ljL3NjNTIwX2FzbS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMTEwYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJfaTM4Ni9pYy9zYzUyMF9hc20uUwpAQCAtMCwwICsxLDUzMCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogRGFuaWVsIEVuZ3N0cvZtLCBPbWljcm9uIENldGkgQUIgPGRhbmllbEBvbWljcm9uLnNlPi4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKiBUaGlzIGZpbGUgaXMgbGFyZ2VseSBiYXNlZCBvbiBjb2RlIG9idG5lZCBmcm9tIEFNRC4gQU1EJ3Mgb3JpZ2luYWwKKyAqIGNvcHlyaWdodCBpcyBpbmNsdWRlZCBiZWxvdyAKKyAqLworCisvKgorICogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICBDb3B5cmlnaHQgMTk5OSBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgVGhpcyBzb2Z0d2FyZSBpcyB0aGUgcHJvcGVydHkgb2YgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jICAoQU1EKSAgd2hpY2ggCisgKiAgc3BlY2lmaWNhbGx5IGdyYW50cyB0aGUgdXNlciB0aGUgcmlnaHQgdG8gbW9kaWZ5LCB1c2UgYW5kIGRpc3RyaWJ1dGUgdGhpcyAKKyAqICBzb2Z0d2FyZSBwcm92aWRlZCB0aGlzIENPUFlSSUdIVCBOT1RJQ0UgaXMgbm90IHJlbW92ZWQgb3IgYWx0ZXJlZC4gIEFsbCAKKyAqICBvdGhlciByaWdodHMgYXJlIHJlc2VydmVkIGJ5IEFNRC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgVEhFIE1BVEVSSUFMUyBBUkUgUFJPVklERUQgIkFTIElTIiBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVFkgCisgKiAgT0YgQU5ZIEtJTkQgSU5DTFVESU5HIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBOT05JTkZSSU5HRU1FTlQgT0YgCisgKiAgVEhJUkQtUEFSVFkgSU5URUxMRUNUVUFMIFBST1BFUlRZLCBPUiBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFLgorICogIElOIE5PIEVWRU5UIFNIQUxMIEFNRCBPUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUgorICogIChJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgREFNQUdFUyBGT1IgTE9TUyBPRiBQUk9GSVRTLCBCVVNJTkVTUworICogIElOVEVSUlVQVElPTiwgTE9TUyBPRiBJTkZPUk1BSVRPTikgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPRiBPUiBJTkFCSUxJVFkKKyAqICBUTyBVU0UgVEhFIE1BVEVSSUFMUywgRVZFTiBJRiBBTUQgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqICBTVUNIIERBTUFHRVMuICBCRUNBVVNFIFNPTUUgSlVSU0lESUNUSU9OUyBQUk9ISUJJVCBUSEUgRVhDTFVTSU9OIE9SCisgKiAgTElNSVRBVElPTiBPRiBMSUFCSUxJVFkgRk9SIENPTlNFUVVFTlRJQUwgT1IgSU5DSURFTlRBTCBEQU1BR0VTLCBUSEUgQUJPVkUKKyAqICBMSU1JVEFUSU9OIE1BWSBOT1QgQVBQTFkgVE8gWU9VLgorICogCisgKiAgQU1EIGRvZXMgbm90IGFzc3VtZSBhbnkgcmVzcG9uc2liaWxpdHkgZm9yIGFueSBlcnJvcnMgdGhhdCBtYXkgYXBwZWFyIGluCisgKiAgdGhlIE1hdGVyaWFscyBub3IgYW55IHJlc3BvbnNpYmlsaXR5IHRvIHN1cHBvcnQgb3IgdXBkYXRlIHRoZSBNYXRlcmlhbHMuCisgKiAgQU1EIHJldGFpbnMgdGhlIHJpZ2h0IHRvIG1ha2UgY2hhbmdlcyB0byBpdHMgdGVzdCBzcGVjaWZpY2F0aW9ucyBhdCBhbnkKKyAqICB0aW1lLCB3aXRob3V0IG5vdGljZS4KKyAqIAorICogIFNvIHRoYXQgYWxsIG1heSBiZW5lZml0IGZyb20geW91ciBleHBlcmllbmNlLCBwbGVhc2UgcmVwb3J0ICBhbnkgIHByb2JsZW1zIAorICogIG9yIHN1Z2dlc3Rpb25zIGFib3V0IHRoaXMgc29mdHdhcmUgYmFjayB0byBBTUQuICBQbGVhc2UgaW5jbHVkZSB5b3VyIG5hbWUsIAorICogIGNvbXBhbnksICB0ZWxlcGhvbmUgbnVtYmVyLCAgQU1EIHByb2R1Y3QgcmVxdWlyaW5nIHN1cHBvcnQgYW5kIHF1ZXN0aW9uIG9yIAorICogIHByb2JsZW0gZW5jb3VudGVyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4gICAgICAgICBXb3JsZHdpZGUgc3VwcG9ydCBhbmQgY29udGFjdCAgICAgICAgICAgCisgKiAgRW1iZWRkZWQgUHJvY2Vzc29yIERpdmlzaW9uICAgICAgICAgICAgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGF0OiAgICAgICAgICAgICAgIAorICogIFN5c3RlbXMgRW5naW5lZXJpbmcgICAgICAgICAgICAgICAgICAgICAgIGVwZC5zdXBwb3J0QGFtZC5jb20KKyAqICA1MjA0IEUuIEJlbiBXaGl0ZSBCbHZkLiAgICAgICAgICAgICAgICAgICAgICAgICAgLW9yLQorICogIEF1c3RpbiwgVFggNzg3NDEgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hbWQuY29tL2h0bWwvc3VwcG9ydC90ZWNoc3VwLmh0bWwKKyAqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJIEFVVEhPUiAgICAgIDogQnVkZHkgRmV5IC0gT3JpZ2luYWwuIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICBGVU5DVElPTkFMIERFU0NSSVBUSU9OOgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBhdXRvZGV0ZWN0IHRoZSBnZW9tZXRyeSBvZiB0aGUgRFJBTS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGNvbHVtbiBiaXRzIGZvciB0aGUgRFJBTQorICogZGV2aWNlcyBpbiB0aGlzIGV4dGVybmFsIGJhbmsuIFRoaXMgcm91dGluZSBhc3N1bWVzIHRoYXQgdGhlIGV4dGVybmFsIGJhbmsKKyAqIGhhcyBiZWVuIGNvbmZpZ3VyZWQgZm9yIGFuIDExLWJpdCBjb2x1bW4gYW5kIGZvciA0IGludGVybmFsIGJhbmtzLiBUaGlzIGdpdmVzCisgKiB1cyB0aGUgbWF4aW11bSBhZGRyZXNzIHJlYWNoIGluIG1lbW9yeS4gQnkgd3JpdGluZyBhIHRlc3QgdmFsdWUgdG8gdGhlIG1heAorICogYWRkcmVzcyBhbmQgbG9jYXRpbmcgd2hlcmUgaXQgYWxpYXNlcyB0bywgd2UgY2FuIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHZhbGlkCisgKiBjb2x1bW4gYml0cy4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGludGVybmFsIGJhbmtzIGVhY2ggRFJBTQorICogZGV2aWNlIGhhcy4gVGhlIGV4dGVybmFsIGJhbmsgKHVuZGVyIHRlc3QpIGlzIGNvbmZpZ3VyZWQgZm9yIG1heGltdW0gcmVhY2gKKyAqIHdpdGggMTEtYml0IGNvbHVtbnMgYW5kIDQgaW50ZXJuYWwgYmFua3MuIFRoaXMgcm91dGluZSB3aWxsIHdyaXRlIHRvIGEgbWF4CisgKiBhZGRyZXNzIChCQTEgYW5kIEJBMCA9IDEpIGFuZCB0aGVuIHJlYWQgZnJvbSBhbiBhZGRyZXNzIHdpdGggQkExPTAgdG8gc2VlIGlmCisgKiB0aGF0IGNvbHVtbiBpcyBhICJkb24ndCBjYXJlIi4gSWYgQkExIGRvZXMgbm90IGFmZmVjdCB3cml0ZS9yZWFkIG9mIGRhdGEsCisgKiB0aGVuIHRoaXMgZGV2aWNlIGhhcyBvbmx5IDIgaW50ZXJuYWwgYmFua3MuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBkZXRlcm1pbmUgdGhlIGVuZGluZyBhZGRyZXNzIGZvciB0aGlzIGV4dGVybmFsCisgKiBiYW5rIG9mIFNEUkFNLiBXZSB3cml0ZSB0byBhIG1heCBhZGRyZXNzIHdpdGggYSBkYXRhIHZhbHVlIGFuZCB0aGVuIGRpc2FibGUKKyAqIHJvdyBhZGRyZXNzIGJpdHMgbG9va2luZyBmb3IgImRvbid0IGNhcmUiIGxvY2F0aW9ucy4gRWFjaCAiZG9uJ3QgY2FyZSIgYml0CisgKiByZXByZXNlbnRzIGEgZGl2aWRpbmcgb2YgdGhlIG1heGltdW0gZGVuc2l0eSAoMTI4TSkgYnkgMi4gQnkgZGl2aWRpbmcgdGhlCisgKiBtYXhpbXVtIG9mIDMyIDRNIGNodW5rcyBpbiBhbiBleHRlcm5hbCBiYW5rIGRvd24gYnkgYWxsIHRoZSAiZG9uJ3QgY2FyZSIgYml0cworICogZGV0ZXJtaW5lZCBkdXJpbmcgc2l6aW5nLCB3ZSBzZXQgdGhlIHByb3BlciBkZW5zaXR5LgorICoKKyAqIFdBUk5JTkdTLgorICogYnAgbXVzdCBiZSBwcmVzZXJ2ZWQgYmVjYXVzZSBpdCBpcyB1c2VkIGZvciByZXR1cm4gbGlua2FnZS4KKyAqCisgKiBFWElUCisgKiBub3RoaW5nIHJldHVybmVkIC0gYnV0IHRoZSBtZW1vcnkgc3Vic3lzdGVtIGlzIGVuYWJsZWQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLnNlY3Rpb24gLnRleHQKKy5lcXUgICAgICAgICAgICBEUkNDVEwsICAgICAweDBmZmZlZjAxMCAgIC8qIERSQU0gY29udHJvbCByZWdpc3RlciAqLworLmVxdSAgICAgICAgICAgIERSQ1RNQ1RMLCAgIDB4MGZmZmVmMDEyICAgLyogRFJBTSB0aW1pbmcgY29udHJvbCByZWdpc3RlciAqLworLmVxdSAgICAgICAgICAgIERSQ0NGRywgICAgIDB4MGZmZmVmMDE0ICAgLyogRFJBTSBiYW5rIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKy5lcXUgICAgICAgICAgICBEUkNCRU5EQURSLCAweDBmZmZlZjAxOCAgIC8qIERSQU0gYmFuayBlbmRpbmcgYWRkcmVzcyByZWdpc3RlciAqLworLmVxdSAgICAgICAgICAgIEVDQ0NUTCwgICAgIDB4MGZmZmVmMDIwICAgLyogRFJBTSBFQ0MgY29udHJvbCByZWdpc3RlciAqLworLmVxdSAgICAgICAgICAgIERCQ1RMLCAgICAgIDB4MGZmZmVmMDQwICAgLyogRFJBTSBidWZmZXIgY29udHJvbCByZWdpc3RlciAqLworCisuZXF1ICAgICAgICAgICAgQ0FDSEVMSU5FU1osIDB4MDAwMDAwMTAgICAvKiBzaXplIG9mIG91ciBjYWNoZSBsaW5lIChyZWFkIGJ1ZmZlcikgKi8KKy5lcXUgICAgICAgICAgICBDT0wxMV9BRFIsICAweDBlMDAxZTAwICAgIC8qIDExIGNvbCBhZGRycyAqLworLmVxdSAgICAgICAgICAgIENPTDEwX0FEUiwgIDB4MGUwMDBlMDAgICAgLyogMTAgY29sIGFkZHJzICovCisuZXF1ICAgICAgICAgICAgQ09MMDlfQURSLCAgMHgwZTAwMDYwMCAgICAvKiAgOSBjb2wgYWRkcnMgKi8KKy5lcXUgICAgICAgICAgICBDT0wwOF9BRFIsICAweDBlMDAwMjAwICAgIC8qICA4IGNvbCBhZGRycyAqLworLmVxdSAgICAgICAgICAgIFJPVzE0X0FEUiwgIDB4MGYwMDAwMDAgICAgLyogMTQgcm93IGFkZHJzICovCisuZXF1ICAgICAgICAgICAgUk9XMTNfQURSLCAgMHgwNzAwMDAwMCAgICAvKiAxMyByb3cgYWRkcnMgKi8KKy5lcXUgICAgICAgICAgICBST1cxMl9BRFIsICAweDAzMDAwMDAwICAgIC8qIDEyIHJvdyBhZGRycyAqLworLmVxdSAgICAgICAgICAgIFJPVzExX0FEUiwgIDB4MDEwMDAwMDAgICAgLyogMTEgcm93IGFkZHJzL2Fsc28gYmFuayBzd2l0Y2ggKi8KKy5lcXUgICAgICAgICAgICBST1cxMF9BRFIsICAweDAwMDAwMDAwICAgIC8qIDEwIHJvdyBhZGRycy9hbHNvIGJhbmsgc3dpdGNoICovCisuZXF1ICAgICAgICAgICAgQ09MMTFfREFUQSwgMHgwYjBiMGIwYiAgICAvKiAxMSBjb2wgYWRkcnMgKi8KKy5lcXUgICAgICAgICAgICBDT0wxMF9EQVRBLCAweDBhMGEwYTBhICAgIC8qIDEwIGNvbCBkYXRhICovCisuZXF1ICAgICAgICAgICAgQ09MMDlfREFUQSwgMHgwOTA5MDkwOSAgICAvKiAgOSBjb2wgZGF0YSAqLworLmVxdSAgICAgICAgICAgIENPTDA4X0RBVEEsIDB4MDgwODA4MDggICAgLyogIDggY29sIGRhdGEgKi8KKy5lcXUgICAgICAgICAgICBST1cxNF9EQVRBLCAweDNmM2YzZjNmICAgIC8qIDE0IHJvdyBkYXRhIChNQVNLKSAqLworLmVxdSAgICAgICAgICAgIFJPVzEzX0RBVEEsIDB4MWYxZjFmMWYgICAgLyogMTMgcm93IGRhdGEgKE1BU0spICovCisuZXF1ICAgICAgICAgICAgUk9XMTJfREFUQSwgMHgwZjBmMGYwZiAgICAvKiAxMiByb3cgZGF0YSAoTUFTSykgKi8KKy5lcXUgICAgICAgICAgICBST1cxMV9EQVRBLCAweDA3MDcwNzA3ICAgIC8qIDExIHJvdyBkYXRhL2Fsc28gYmFuayBzd2l0Y2ggKE1BU0spICovCisuZXF1ICAgICAgICAgICAgUk9XMTBfREFUQSwgMHhhYWFhYWFhYSAgICAvKiAxMCByb3cgZGF0YS9hbHNvIGJhbmsgc3dpdGNoIChNQVNLKSAqLworCisKKyAvKgorICAqIGluaXRpYWxpemUgZHJhbSBjb250cm9sbGVyIHJlZ2lzdGVycworICAqLworLmdsb2JsIG1lbV9pbml0CittZW1faW5pdDogCisgICAgICAgIHhvcncgICAgJWF4LCVheAorICAgICAgICBtb3ZsICAgICREQkNUTCwgJWVkaSAgICAgICAgICAgICAKK2ZzCW1vdmIgICAgICVhbCwgKCVlZGkpICAgICAgICAgICAgIC8qIGRpc2FibGUgd3JpdGUgYnVmZmVyICovCisKKyAgICAgICAgbW92bCAgICAkRUNDQ1RMLCAlZWRpICAgICAgICAgICAgCitmcwltb3ZiICAgICAlYWwsICglZWRpKSAgICAgICAgICAgICAvKiBkaXNhYmxlIEVDQyAqLworCisgICAgICAgIG1vdmwgICAgJERSQ1RNQ1RMLCAlZWRpICAgICAgICAgICAKKyAgICAgICAgbW92YiAgICAkMHgxRSwlYWwgICAgICAgICAgICAgICAgLyogU2V0IFNEUkFNIHRpbWluZyBmb3Igc2xvd2VzdCAqLworZnMJbW92YiAgICAgJWFsLCAoJWVkaSkKKworIC8qCisgICogc2V0dXAgbG9vcCB0byBkbyA0IGV4dGVybmFsIGJhbmtzIHN0YXJ0aW5nIHdpdGggYmFuayAzCisgICovCisgICAgICAgIG1vdmwgICAgJDB4ZmYwMDAwMDAsJWVheCAgICAgICAgIC8qIGVuYWJsZSBsYXN0IGJhbmsgYW5kIHNldHVwICovCisgICAgICAgIG1vdmwgICAgJERSQ0JFTkRBRFIsICVlZGkgICAgICAgIC8qIGVuZGluZyBhZGRyZXNzIHJlZ2lzdGVyICovCitmcwltb3ZsICAgICAlZWF4LCAoJWVkaSkKKworICAgICAgICBtb3ZsICAgICREUkNDRkcsICVlZGkgICAgICAgICAgICAvKiBzZXR1cCAqLworICAgICAgICBtb3Z3ICAgICQweGJiYmIsJWF4ICAgICAgICAgICAgICAvKiBkcmFtIGNvbmZpZyByZWdpc3RlciBmb3IgICovCitmcwltb3Z3ICAgICVheCwgKCVlZGkpCisKKyAvKgorICAqIGlzc3VlIGEgTk9QIHRvIGFsbCBEUkFNcworICAqLworICAgICAgICBtb3ZsICAgICREUkNDVEwsICVlZGkgICAgICAgICAgICAvKiBzZXR1cCBEUkFNIGNvbnRyb2wgcmVnaXN0ZXIgd2l0aCAqLworICAgICAgICBtb3ZiICAgICQweDEsJWFsICAgICAgICAgICAgICAgICAvKiBEaXNhYmxlIHJlZnJlc2gsZGlzYWJsZSB3cml0ZSBidWZmZXIgKi8gCitmcwltb3ZiICAgICAlYWwsICglZWRpKQorICAgICAgICBtb3ZsICAgICRDQUNIRUxJTkVTWiwgJWVzaSAgICAgICAvKiBqdXN0IGEgZHVtbXkgYWRkcmVzcyB0byB3cml0ZSBmb3IgKi8gCitmcwltb3Z3ICAgICAlYXgsICglZXNpKQorIC8qCisgICogZGVsYXkgZm9yIDEwMCB1c2VjPyAyMDA/CisgICogKioqKioqdGhpcyBpcyBhIGNsdWRnZSBmb3Igbm93ICoqKioqKioqKioqKioKKyAgKi8KKyAgICAgICAgbW92dyAgICAkMTAwLCVjeAorc2l6ZGVsYXk6IAorICAgICAgICBsb29wICAgIHNpemRlbGF5ICAgICAgICAgICAgICAgICAvKiB3ZSBuZWVkIDEwMCB1c2VjIGhlcmUgKi8KKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAvKgorICAqIGlzc3VlIGFsbCBiYW5rcyBwcmVjaGFyZ2UKKyAgKi8KKyAgICAgICAgbW92YiAgICAkMHgyLCVhbCAgICAgICAgICAgICAgICAgLyogQWxsIGJhbmtzIHByZWNoYXJnZSAqLworZnMJbW92YiAgICAgJWFsLCAoJWVkaSkKK2ZzCW1vdncgICAgICVheCwgKCVlc2kpCisKKyAvKgorICAqIGlzc3VlIDIgYXV0byByZWZyZXNoZXMgdG8gYWxsIGJhbmtzIAorICAqLworICAgICAgICBtb3ZiICAgICQweDQsJWFsICAgICAgICAgICAgICAgICAvKiBBdXRvIHJlZnJlc2ggY21kICovCitmcwltb3ZiICAgICAlYWwsICglZWRpKQorICAgICAgICBtb3Z3ICAgICQyLCVjeAorcmVmcmVzaDE6IAorZnMJbW92dyAgICAgJWF4LCAoJWVzaSkKKyAgICAgICAgbG9vcCAgICByZWZyZXNoMQorCisgLyoKKyAgKiBpc3N1ZSBMT0FEIE1PREUgUkVHSVNURVIgY29tbWFuZAorICAqLworICAgICAgICBtb3ZiICAgICQweDMsJWFsICAgICAgICAgICAgICAgICAvKiBMb2FkIG1vZGUgcmVnaXN0ZXIgY21kICovCitmcwltb3ZiICAgICAlYWwsICglZWRpKQorZnMJbW92dyAgICAgJWF4LCAoJWVzaSkKKworIC8qCisgICogaXNzdWUgOCBtb3JlIGF1dG8gcmVmcmVzaGVzIHRvIGFsbCBiYW5rcyAKKyAgKi8gCisgICAgICAgIG1vdmIgICAgJDB4NCwlYWwgICAgICAgICAgICAgICAgIC8qIEF1dG8gcmVmcmVzaCBjbWQgKi8KK2ZzCW1vdmIgICAgICVhbCwgKCVlZGkpCisgICAgICAgIG1vdncgICAgJDgsJWN4CityZWZyZXNoMjogCitmcwltb3Z3ICAgICAlYXgsICglZXNpKQorICAgICAgICBsb29wICAgIHJlZnJlc2gyCisKKyAvKgorICAqIHNldCBjb250cm9sIHJlZ2lzdGVyIHRvIE5PUk1BTCBtb2RlIAorICAqLworICAgICAgICBtb3ZiICAgICQweDAsJWFsICAgICAgICAgICAgICAgICAvKiBOb3JtYWwgbW9kZSB2YWx1ZSAqLworZnMJbW92YiAgICAgJWFsLCAoJWVkaSkKKworIC8qCisgICogc2l6ZSBkcmFtIHN0YXJ0aW5nIHdpdGggZXh0ZXJuYWwgYmFuayAzIG1vdmluZyB0byBleHRlcm5hbCBiYW5rIDAKKyAgKi8KKyAgICAgICAgbW92bCAgICAkMHgzLCVlY3ggICAgICAgICAgICAgICAgLyogc3RhcnQgd2l0aCBleHRlcm5hbCBiYW5rIDMgKi8KKworbmV4dGJhbms6IAorCisgLyoKKyAgKiB3cml0ZSBjb2wgMTEgd3JhcCBhZHIKKyAgKi8KKyAgICAgICAgbW92bCAgICAkQ09MMTFfQURSLCAlZXNpICAgICAgICAgLyogc2V0IGFkZHJlc3MgdG8gbWF4IGNvbCAoMTEpIHdyYXAgYWRkciAqLworICAgICAgICBtb3ZsICAgICRDT0wxMV9EQVRBLCAlZWF4ICAgICAgICAvKiBwYXR0ZXJuIGZvciBtYXggc3VwcG9ydGVkIGNvbHVtbnMoMTEpICovCitmcyAgICAgIG1vdmwgICAgJWVheCwgKCVlc2kpICAgICAgICAgICAgIC8qIHdyaXRlIG1heCBjb2wgcGF0dGVybiBhdCBtYXggY29sIGFkciAqLworZnMgICAgICBtb3ZsICAgICglZXNpKSwgJWVieCAgICAgICAgICAgICAvKiBvcHRpb25hbCByZWFkICovCisgICAgICAgIGNtcGwgICAgJWVieCwlZWF4ICAgICAgICAgICAgICAgIC8qIHRvIHZlcmlmeSB3cml0ZSAqLworICAgICAgICBqbnogICAgIGJhZF9yYW0gICAgICAgICAgICAgICAgICAvKiB0aGlzIHJhbSBpcyBiYWQgKi8KKyAvKgorICAqIHdyaXRlIGNvbCAxMCB3cmFwIGFkcgorICAqLworCisgICAgICAgIG1vdmwgICAgJENPTDEwX0FEUiwgJWVzaSAgICAgICAgIC8qIHNldCBhZGRyZXNzIHRvIDEwIGNvbCB3cmFwIGFkZHJlc3MgKi8KKyAgICAgICAgbW92bCAgICAkQ09MMTBfREFUQSwgJWVheCAgICAgICAgLyogcGF0dGVybiBmb3IgMTAgY29sIHdyYXAgKi8KK2ZzICAgICAgbW92bCAgICAlZWF4LCAoJWVzaSkgICAgICAgICAgICAgLyogd3JpdGUgMTAgY29sIHBhdHRlcm4gQCAxMCBjb2wgd3JhcCBhZHIgKi8KK2ZzICAgICAgbW92bCAgICAoJWVzaSksICVlYnggICAgICAgICAgICAgLyogb3B0aW9uYWwgcmVhZCAqLworICAgICAgICBjbXBsICAgICVlYngsJWVheCAgICAgICAgICAgICAgICAvKiB0byB2ZXJpZnkgd3JpdGUgKi8KKyAgICAgICAgam56ICAgICBiYWRfcmFtICAgICAgICAgICAgICAgICAgLyogdGhpcyByYW0gaXMgYmFkICovCisgLyoKKyAgKiB3cml0ZSBjb2wgOSB3cmFwIGFkcgorICAqLworICAgICAgICBtb3ZsICAgICRDT0wwOV9BRFIsICVlc2kgICAgICAgICAvKiBzZXQgYWRkcmVzcyB0byA5IGNvbCB3cmFwIGFkZHJlc3MgKi8KKyAgICAgICAgbW92bCAgICAkQ09MMDlfREFUQSwgJWVheCAgICAgICAgLyogcGF0dGVybiBmb3IgOSBjb2wgd3JhcCAqLworZnMgICAgICBtb3ZsICAgICVlYXgsICglZXNpKSAgICAgICAgICAgICAvKiB3cml0ZSA5IGNvbCBwYXR0ZXJuIEAgOSBjb2wgd3JhcCBhZHIgKi8KK2ZzICAgICAgbW92bCAgICAoJWVzaSksICVlYnggICAgICAgICAgICAgLyogb3B0aW9uYWwgcmVhZCAqLworICAgICAgICBjbXBsICAgICVlYngsJWVheCAgICAgICAgICAgICAgICAvKiB0byB2ZXJpZnkgd3JpdGUgKi8KKyAgICAgICAgam56ICAgICBiYWRfcmFtICAgICAgICAgICAgICAgICAgLyogdGhpcyByYW0gaXMgYmFkICovCisgLyoKKyAgKiB3cml0ZSBjb2wgOCB3cmFwIGFkcgorICAqLworICAgICAgICBtb3ZsICAgICRDT0wwOF9BRFIsICVlc2kgICAgICAgICAvKiBzZXQgYWRkcmVzcyB0byBtaW4oOCkgY29sIHdyYXAgYWRkcmVzcyAqLworICAgICAgICBtb3ZsICAgICRDT0wwOF9EQVRBLCAlZWF4ICAgICAgICAvKiBwYXR0ZXJuIGZvciBtaW4gKDgpIGNvbCB3cmFwICovCitmcyAgICAgIG1vdmwgICAgJWVheCwgKCVlc2kpICAgICAgICAgICAgIC8qIHdyaXRlIG1pbiBjb2wgcGF0dGVybiBAIG1pbiBjb2wgYWRyICovCitmcyAgICAgIG1vdmwgICAgKCVlc2kpLCAlZWJ4ICAgICAgICAgICAgIC8qIG9wdGlvbmFsIHJlYWQgKi8KKyAgICAgICAgY21wbCAgICAlZWJ4LCVlYXggICAgICAgICAgICAgICAgLyogdG8gdmVyaWZ5IHdyaXRlICovCisgICAgICAgIGpueiAgICAgYmFkX3JhbSAgICAgICAgICAgICAgICAgIC8qIHRoaXMgcmFtIGlzIGJhZCAqLworIC8qCisgICogd3JpdGUgcm93IDE0IHdyYXAgYWRyCisgICovCisgICAgICAgIG1vdmwgICAgJFJPVzE0X0FEUiwgJWVzaSAgICAgICAgIC8qIHNldCBhZGRyZXNzIHRvIG1heCByb3cgKDE0KSB3cmFwIGFkZHIgKi8KKyAgICAgICAgbW92bCAgICAkUk9XMTRfREFUQSwgJWVheCAgICAgICAgLyogcGF0dGVybiBmb3IgbWF4IHN1cHBvcnRlZCByb3dzKDE0KSAqLworZnMgICAgICBtb3ZsICAgICVlYXgsICglZXNpKSAgICAgICAgICAgICAvKiB3cml0ZSBtYXggcm93IHBhdHRlcm4gYXQgbWF4IHJvdyBhZHIgKi8KK2ZzICAgICAgbW92bCAgICAoJWVzaSksICVlYnggICAgICAgICAgICAgLyogb3B0aW9uYWwgcmVhZCAqLworICAgICAgICBjbXBsICAgICVlYngsJWVheCAgICAgICAgICAgICAgICAvKiB0byB2ZXJpZnkgd3JpdGUgKi8KKyAgICAgICAgam56ICAgICBiYWRfcmFtICAgICAgICAgICAgICAgICAgLyogdGhpcyByYW0gaXMgYmFkICovCisgLyoKKyAgKiB3cml0ZSByb3cgMTMgd3JhcCBhZHIKKyAgKi8KKyAgICAgICAgbW92bCAgICAkUk9XMTNfQURSLCAlZXNpICAgICAgICAgLyogc2V0IGFkZHJlc3MgdG8gMTMgcm93IHdyYXAgYWRkcmVzcyAqLworICAgICAgICBtb3ZsICAgICRST1cxM19EQVRBLCAlZWF4ICAgICAgICAvKiBwYXR0ZXJuIGZvciAxMyByb3cgd3JhcCAqLworZnMgICAgICBtb3ZsICAgICVlYXgsICglZXNpKSAgICAgICAgICAgICAvKiB3cml0ZSAxMyByb3cgcGF0dGVybiBAIDEzIHJvdyB3cmFwIGFkciAqLworZnMgICAgICBtb3ZsICAgICglZXNpKSwgJWVieCAgICAgICAgICAgICAvKiBvcHRpb25hbCByZWFkICovCisgICAgICAgIGNtcGwgICAgJWVieCwlZWF4ICAgICAgICAgICAgICAgIC8qIHRvIHZlcmlmeSB3cml0ZSAqLworICAgICAgICBqbnogICAgIGJhZF9yYW0gICAgICAgICAgICAgICAgICAvKiB0aGlzIHJhbSBpcyBiYWQgKi8KKyAvKgorICAqIHdyaXRlIHJvdyAxMiB3cmFwIGFkcgorICAqLworICAgICAgICBtb3ZsICAgICRST1cxMl9BRFIsICVlc2kgICAgICAgICAvKiBzZXQgYWRkcmVzcyB0byAxMiByb3cgd3JhcCBhZGRyZXNzICovCisgICAgICAgIG1vdmwgICAgJFJPVzEyX0RBVEEsICVlYXggICAgICAgIC8qIHBhdHRlcm4gZm9yIDEyIHJvdyB3cmFwICovCitmcyAgICAgIG1vdmwgICAgJWVheCwgKCVlc2kpICAgICAgICAgICAgIC8qIHdyaXRlIDEyIHJvdyBwYXR0ZXJuIEAgMTIgcm93IHdyYXAgYWRyICovCitmcyAgICAgIG1vdmwgICAgKCVlc2kpLCAlZWJ4ICAgICAgICAgICAgIC8qIG9wdGlvbmFsIHJlYWQgKi8KKyAgICAgICAgY21wbCAgICAlZWJ4LCVlYXggICAgICAgICAgICAgICAgLyogdG8gdmVyaWZ5IHdyaXRlICovCisgICAgICAgIGpueiAgICAgYmFkX3JhbSAgICAgICAgICAgICAgICAgIC8qIHRoaXMgcmFtIGlzIGJhZCAqLworIC8qCisgICogd3JpdGUgcm93IDExIHdyYXAgYWRyCisgICovCisgICAgICAgIG1vdmwgICAgJFJPVzExX0FEUiwgJWVkaSAgICAgICAgIC8qIHNldCBhZGRyZXNzIHRvIDExIHJvdyB3cmFwIGFkZHJlc3MgKi8KKyAgICAgICAgbW92bCAgICAkUk9XMTFfREFUQSwgJWVheCAgICAgICAgLyogcGF0dGVybiBmb3IgMTEgcm93IHdyYXAgKi8KK2ZzICAgICAgbW92bCAgICAlZWF4LCAoJWVkaSkgICAgICAgICAgICAgLyogd3JpdGUgMTEgcm93IHBhdHRlcm4gQCAxMSByb3cgd3JhcCBhZHIgKi8KK2ZzICAgICAgbW92bCAgICAoJWVkaSksICVlYnggICAgICAgICAgICAgLyogb3B0aW9uYWwgcmVhZCAqLworICAgICAgICBjbXBsICAgICVlYngsJWVheCAgICAgICAgICAgICAgICAvKiB0byB2ZXJpZnkgd3JpdGUgKi8KKyAgICAgICAgam56ICAgICBiYWRfcmFtICAgICAgICAgICAgICAgICAgLyogdGhpcyByYW0gaXMgYmFkICovCisgLyoKKyAgKiB3cml0ZSByb3cgMTAgd3JhcCBhZHIgLS0tIHRoaXMgd3JpdGUgaXMgcmVhbGx5IHRvIGRldGVybWluZSBudW1iZXIgb2YgYmFua3MKKyAgKi8KKyAgICAgICAgbW92bCAgICAkUk9XMTBfQURSLCAlZWRpICAgICAgICAgLyogc2V0IGFkZHJlc3MgdG8gMTAgcm93IHdyYXAgYWRkcmVzcyAqLworICAgICAgICBtb3ZsICAgICRST1cxMF9EQVRBLCAlZWF4ICAgICAgICAvKiBwYXR0ZXJuIGZvciAxMCByb3cgd3JhcCAoQUEpICovCitmcyAgICAgIG1vdmwgICAgJWVheCwgKCVlZGkpICAgICAgICAgICAgIC8qIHdyaXRlIDEwIHJvdyBwYXR0ZXJuIEAgMTAgcm93IHdyYXAgYWRyICovCitmcyAgICAgIG1vdmwgICAgKCVlZGkpLCAlZWJ4ICAgICAgICAgICAgIC8qIG9wdGlvbmFsIHJlYWQgKi8KKyAgICAgICAgY21wbCAgICAlZWJ4LCVlYXggICAgICAgICAgICAgICAgLyogdG8gdmVyaWZ5IHdyaXRlICovCisgICAgICAgIGpueiAgICAgYmFkX3JhbSAgICAgICAgICAgICAgICAgIC8qIHRoaXMgcmFtIGlzIGJhZCAqLworIC8qCisgICogcmVhZCBkYXRhIEAgcm93IDEyIHdyYXAgYWRyIHRvIGRldGVybWluZSAgKiBiYW5rcywgCisgICogYW5kIHJlYWQgZGF0YSBAIHJvdyAxNCB3cmFwIGFkciB0byBkZXRlcm1pbmUgICogcm93cy4KKyAgKiBpZiBkYXRhIEAgcm93IDEyIHdyYXAgYWRyIGlzIG5vdCBBQSwgMTEgb3IgMTIgd2UgaGF2ZSBiYWQgUkFNLgorICAqIGlmIGRhdGEgQCByb3cgMTIgd3JhcCA9PSBBQSwgd2Ugb25seSBoYXZlIDIgYmFua3MsIE5PVCA0IAorICAqIGlmIGRhdGEgQCByb3cgMTIgd3JhcCA9PSAxMSBvciAxMiwgd2UgaGF2ZSA0IGJhbmtzLAorICAqLworICAgICAgICB4b3J3ICAgICVkaSwlZGkgICAgICAgICAgICAgICAgICAvKiB2YWx1ZSBmb3IgMiBiYW5rcyBpbiBESSAqLworZnMgICAgICBtb3ZsICAgICglZXNpKSwgJWVieCAgICAgICAgICAgICAvKiByZWFkIGZyb20gMTIgcm93IHdyYXAgdG8gY2hlY2sgYmFua3MgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChlc2kgaXMgc2V0dXAgZnJvbSB0aGUgd3JpdGUgdG8gcm93IDEyIHdyYXApICovCisgICAgICAgIGNtcGwgICAgJWVieCwlZWF4ICAgICAgICAgICAgICAgIC8qIGNoZWNrIGZvciBBQSBwYXR0ZXJuICAoZWF4IGhvbGRzIHRoZSBhYSBwYXR0ZXJuKSAqLworICAgICAgICBqeiAgICAgIG9ubHkyICAgICAgICAgICAgICAgICAgICAvKiBpZiBwYXR0ZXJuID09IEFBLCB3ZSBvbmx5IGhhdmUgMiBiYW5rcyAqLworCisJLyogNCBiYW5rcyAqLworCQorICAgICAgICBtb3Z3ICAgICQ4LCVkaSAgICAgICAgICAgICAgICAgICAvKiB2YWx1ZSBmb3IgNCBiYW5rcyBpbiBESSAoQk5LX0NOVCBiaXQpICovCisgICAgICAgIGNtcGwgICAgJFJPVzExX0RBVEEsICVlYnggICAgICAgIC8qIG9ubHkgb3RoZXIgbGVnaXRpbWF0ZSB2YWx1ZXMgYXJlIDExICovCisgICAgICAgIGp6ICAgICAgb25seTIKKyAgICAgICAgY21wbCAgICAkUk9XMTJfREFUQSwgJWVieCAgICAgICAgLyogYW5kIDEyICovCisgICAgICAgIGpueiAgICAgYmFkX3JhbSAgICAgICAgICAgICAgICAgIC8qIGl0cyBiYWQgaWYgbm90IDExIG9yIDEyISAqLworCQorCS8qIGZhbGwgdGhyb3VnaCAqLworb25seTI6IAorIC8qCisgICogdmFsaWRhdGUgcm93IG1hc2sKKyAgKi8KKyAgICAgICAgbW92bCAgICAkUk9XMTRfQURSLCAlZXNpICAgICAgICAgLyogc2V0IGFkZHJlc3MgYmFjayB0byBtYXggcm93IHdyYXAgYWRkciAqLworZnMgICAgICBtb3ZsICAgICglZXNpKSwgJWVheCAgICAgICAgICAgICAvKiByZWFkIGFjdHVhbCBudW1iZXIgb2Ygcm93cyBAIHJvdzE0IGFkciAqLworCisgICAgICAgIGNtcGwgICAgJFJPVzExX0RBVEEsICVlYXggICAgICAgIC8qIHJvdyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxMSBwYXR0ZXJuICovCisgICAgICAgIGpiICAgICAgYmFkX3JhbQorCisgICAgICAgIGNtcGwgICAgJFJPVzE0X0RBVEEsICVlYXggICAgICAgIC8qIGFuZCByb3cgbXVzdCBiZSBsZXNzIHRoYW4gMTQgcGF0dGVybiAqLworICAgICAgICBqYSAgICAgIGJhZF9yYW0KKworICAgICAgICBjbXBiICAgICVhaCwlYWwgICAgICAgICAgICAgICAgICAvKiB2ZXJpZnkgYWxsIDQgYnl0ZXMgb2YgZHdvcmQgc2FtZSAqLworICAgICAgICBqbnogICAgIGJhZF9yYW0KKyAgICAgICAgbW92bCAgICAlZWF4LCVlYngKKyAgICAgICAgc2hybCAgICAkMTYsJWVieAorICAgICAgICBjbXB3ICAgICVieCwlYXgKKyAgICAgICAgam56ICAgICBiYWRfcmFtCisgLyoKKyAgKiByZWFkIGNvbCAxMSB3cmFwIGFkciBmb3IgcmVhbCBjb2x1bW4gZGF0YSB2YWx1ZQorICAqLworICAgICAgICBtb3ZsICAgICRDT0wxMV9BRFIsICVlc2kgICAgICAgICAvKiBzZXQgYWRkcmVzcyB0byBtYXggY29sICgxMSkgd3JhcCBhZGRyICovCitmcyAgICAgIG1vdmwgICAgKCVlc2kpLCAlZWF4ICAgICAgICAgICAgIC8qIHJlYWQgcmVhbCBjb2wgbnVtYmVyIGF0IG1heCBjb2wgYWRyICovCisgLyoKKyAgKiB2YWxpZGF0ZSBjb2x1bW4gZGF0YQorICAqLworICAgICAgICBjbXBsICAgICRDT0wwOF9EQVRBLCAlZWF4ICAgICAgICAvKiBjb2wgbXVzdCBiZSBncmVhdGVyIHRoYW4gOCBwYXR0ZXJuICovCisgICAgICAgIGpiICAgICAgYmFkX3JhbQorCisgICAgICAgIGNtcGwgICAgJENPTDExX0RBVEEsICVlYXggICAgICAgIC8qIGFuZCByb3cgbXVzdCBiZSBsZXNzIHRoYW4gMTEgcGF0dGVybiAqLworICAgICAgICBqYSAgICAgIGJhZF9yYW0KKworICAgICAgICBzdWJsICAgICRDT0wwOF9EQVRBLCAlZWF4ICAgICAgICAvKiBub3JtYWxpemUgY29sdW1uIGRhdGEgdG8gemVybyAqLworICAgICAgICBqYyAgICAgIGJhZF9yYW0KKyAgICAgICAgY21wYiAgICAlYWgsJWFsICAgICAgICAgICAgICAgICAgLyogdmVyaWZ5IGFsbCA0IGJ5dGVzIG9mIGR3b3JkIGVxdWFsICovCisgICAgICAgIGpueiAgICAgYmFkX3JhbQorICAgICAgICBtb3ZsICAgICVlYXgsJWVkeAorICAgICAgICBzaHJsICAgICQxNiwlZWR4CisgICAgICAgIGNtcHcgICAgJWR4LCVheAorICAgICAgICBqbnogICAgIGJhZF9yYW0KKyAvKgorICAqIG1lcmdlIGJhbmsgYW5kIGNvbCBkYXRhIHRvZ2V0aGVyCisgICovCisgICAgICAgIGFkZHcgICAgJWRpLCVkeCAgICAgICAgICAgICAgICAgIC8qIG1lcmdlIG9mIGJhbmsgYW5kIGNvbCBpbmZvIGluIGRsICovCisgLyoKKyAgKiBmaXggZW5kaW5nIGFkZHIgbWFzayBiYXNlZCB1cG9uIGNvbCBpbmZvCisgICovCisgICAgICAgIG1vdmIgICAgJDMsJWFsCisgICAgICAgIHN1YmIgICAgJWRoLCVhbCAgICAgICAgICAgICAgICAgIC8qIGRoIGNvbnRhaW5zIHRoZSBvdmVyZmxvdyBmcm9tIHRoZSBiYW5rL2NvbCBtZXJnZSAgKi8KKyAgICAgICAgbW92YiAgICAlYmwsJWRoICAgICAgICAgICAgICAgICAgLyogYmwgY29udGFpbnMgdGhlIHJvdyBtYXNrIChhYSwgMDcsIDBmLCAxZiBvciAzZikgKi8KKyAgICAgICAgeGNoZ3cgICAlY3gsJWF4ICAgICAgICAgICAgICAgICAgLyogY3ggPSBheCA9IDMgb3IgMiBkZXBlbmRpbmcgb24gMiBvciA0IGJhbmsgZGV2aWNlICovCisgICAgICAgIHNocmIgICAgJWNsLCVkaAkgICAgICAgICAgICAgICAgIC8qICAqLworICAgICAgICBpbmNiICAgICVkaCAgICAgICAgICAgICAgICAgICAgICAvKiBlbmRpbmcgYWRkciBpcyAxIGdyZWF0ZXIgdGhhbiByZWFsIGVuZCAqLworICAgICAgICB4Y2hndyAgICVjeCwlYXggICAgICAgICAgICAgICAgICAvKiBjeCBpcyBiYW5rIG51bWJlciBhZ2FpbiAqLworIC8qCisgICogaXNzdWUgYWxsIGJhbmtzIHByZWNoYXJnZQorICAqLworYmFkX3JlaW50OiAKKyAgICAgICAgbW92bCAgICAkRFJDQ1RMLCAlZXNpICAgICAgICAgICAgLyogc2V0dXAgRFJBTSBjb250cm9sIHJlZ2lzdGVyIHdpdGggKi8KKyAgICAgICAgbW92YiAgICAkMHgyLCVhbCAgICAgICAgICAgICAgICAgLyogQWxsIGJhbmtzIHByZWNoYXJnZSAqLworZnMJbW92YiAgICAgJWFsLCAoJWVzaSkKKyAgICAgICAgbW92bCAgICAkQ0FDSEVMSU5FU1osICVlc2kgICAgICAgLyogYWRkcmVzcyB0byBpbml0IHJlYWQgYnVmZmVyICovCitmcwltb3Z3ICAgICAlYXgsICglZXNpKQorCisgLyoKKyAgKiB1cGRhdGUgRU5ESU5HIEFERFJFU1MgUkVHSVNURVIKKyAgKi8KKyAgICAgICAgbW92bCAgICAkRFJDQkVOREFEUiwgJWVkaSAgICAgICAgLyogRFJBTSBlbmRpbmcgYWRkcmVzcyByZWdpc3RlciAqLworICAgICAgICBtb3ZsICAgICVlY3gsJWVieAorCWFkZGwJJWVieCwgJWVkaQorZnMJbW92YiAgICAlZGgsICglZWRpKQorIC8qCisgICogdXBkYXRlIENPTkZJRyBSRUdJU1RFUgorICAqLworICAgICAgICB4b3JiICAgICVkaCwlZGgKKyAgICAgICAgbW92dyAgICAkMHgwMGYsJWJ4CisgICAgICAgIG1vdncgICAgJWN4LCVheAorICAgICAgICBzaGx3ICAgICQyLCVheAorICAgICAgICB4Y2hndyAgICVjeCwlYXgKKyAgICAgICAgc2hsdyAgICAlY2wsJWR4CisgICAgICAgIHNobHcgICAgJWNsLCVieAorICAgICAgICBub3R3ICAgICVieAorICAgICAgICB4Y2hndyAgICVjeCwlYXgKKyAgICAgICAgbW92bCAgICAkRFJDQ0ZHLCAlZWRpCitmcwltb3YgICAgICglZWRpKSwgJWF4CisgICAgICAgIGFuZHcgICAgJWJ4LCVheAorICAgICAgICBvcncgICAgICVkeCwlYXgKK2ZzICAgICAgbW92dyAgICAlYXgsICglZWRpKQorICAgICAgICBqY3h6ICAgIGNsZWFudXAKKworICAgICAgICBkZWN3ICAgICVjeAorICAgICAgICBtb3ZsICAgICVlY3gsJWVieAorICAgICAgICBtb3ZsICAgICREUkNCRU5EQURSLCAlZWRpICAgICAgICAvKiBEUkFNIGVuZGluZyBhZGRyZXNzIHJlZ2lzdGVyICovCisgICAgICAgIG1vdmIgICAgJDB4ZmYsJWFsCisJYWRkbAklZWJ4LCAlZWRpCitmcwltb3ZiICAgICVhbCwgKCVlZGkpCisgLyoKKyAgKiBzZXQgY29udHJvbCByZWdpc3RlciB0byBOT1JNQUwgbW9kZSAKKyAgKi8KKyAgICAgICAgbW92bCAgICAkRFJDQ1RMLCAlZXNpICAgICAgICAgICAgLyogc2V0dXAgRFJBTSBjb250cm9sIHJlZ2lzdGVyIHdpdGggKi8KKyAgICAgICAgbW92YiAgICAkMHgwLCVhbCAgICAgICAgICAgICAgICAgLyogTm9ybWFsIG1vZGUgdmFsdWUgKi8KK2ZzCW1vdmIgICAgJWFsLCAoJWVzaSkKKyAgICAgICAgbW92bCAgICAkQ0FDSEVMSU5FU1osICVlc2kgICAgICAgLyogYWRkcmVzcyB0byBpbml0IHJlYWQgYnVmZmVyICovCitmcwltb3Z3ICAgICVheCwgKCVlc2kpCisgICAgICAgIGptcCAgICAgbmV4dGJhbmsKKworY2xlYW51cDogCisgICAgICAgIG1vdmwgICAgJERSQ0JFTkRBRFIsICVlZGkgICAgICAgIC8qIERSQU0gZW5kaW5nIGFkZHJlc3MgcmVnaXN0ZXIgICovCisgICAgICAgIG1vdncgICAgJDQsJWN4CisgICAgICAgIHhvcncgICAgJWF4LCVheAorY2xlYW51cGxwOiAKK2ZzCW1vdmIgICAoJWVkaSksICVhbAorICAgICAgICBvcmIgICAgICVhbCwlYWwKKyAgICAgICAganogICAgICBlbXB0eWJhbmsKKworICAgICAgICBhZGRiICAgICVhaCwlYWwKKyAgICAgICAgam5zICAgICBub3R0b29tdWNoCisKKyAgICAgICAgbW92YiAgICAkMHg3ZiwlYWwKK25vdHRvb211Y2g6IAorICAgICAgICBtb3ZiICAgICVhbCwlYWgKKyAgICAgICAgb3JiICAgICAkMHg4MCwlYWwKK2ZzCW1vdmIgICAgJWFsLCAoJWVkaSkKK2VtcHR5YmFuazogCisgICAgICAgIGluY2wgICAgJWVkaQorICAgICAgICBsb29wICAgIGNsZWFudXBscAorCisjaWYgZGVmaW5lZChDRkdfU0RSQU1fQ0FTX0xBVEVOQ1lfMlQpIHx8IGRlZmluZWQoQ0ZHX1NEUkFNX0NBU19MQVRFTkNZXzNUKQorCS8qIHNldCB0aGUgQ0FTIGxhdGVuY3kgbm93IHNpbmNlIGl0IGlzIGhhcmQgdG8gZG8KKwkgKiB3aGVuIHdlIHJ1biBmcm9tIHRoZSBSQU0gKi8KKwltb3ZsICAgICREUkNUTUNUTCwgJWVkaSAgICAgICAgICAvKiBEUkFNIHRpbWluZyByZWdpc3RlciAqLworCW1vdmIgICAgKCVlZGkpLCAlYWwJCisjaWZkZWYgQ0ZHX1NEUkFNX0NBU19MQVRFTkNZXzJUCisJYW5kYiAgICAkMHhlZiwgJWFsCisjZW5kaWYKKyNpZmRlZiBDRkdfU0RSQU1fQ0FTX0xBVEVOQ1lfM1QKKwlvcmIgICAgICQweDEwLCAlYWwKKyNlbmRpZgkgCisJbW92YiAgICAlYWwsICglZWRpKQorI2VuZGlmCisgICAgICAgIG1vdmwgICAgJERSQ0NUTCwgJWVkaSAgICAgICAgICAgIC8qIERSQU0gQ29udHJvbCByZWdpc3RlciAqLworICAgICAgICBtb3ZiICAgICQweDMsJWFsICAgICAgICAgICAgICAgICAvKiBMb2FkIG1vZGUgcmVnaXN0ZXIgY21kICovCitmcwltb3ZiICAgICAlYWwsICglZWRpKQorZnMJbW92dyAgICAgJWF4LCAoJWVzaSkKKworCisgICAgICAgIG1vdmwgICAgJERSQ0NUTCwgJWVkaSAgICAgICAgICAgIC8qIERSQU0gQ29udHJvbCByZWdpc3RlciAqLworICAgICAgICBtb3ZiICAgICQweDE4LCVhbCAgICAgICAgICAgICAgICAvKiAgRW5hYmxlIHJlZnJlc2ggYW5kIE5PUk1BTCBtb2RlICovCitmcwltb3ZiICAgICVhbCwgKCVlZGkpCisKKyAgICAgICAgam1wICAgICBkcmFtX2RvbmUKKworYmFkX3JhbTogCisgICAgICAgIHhvcmwgICAgJWVkeCwlZWR4CisgICAgICAgIHhvcmwgICAgJWVkaSwlZWRpCisgICAgICAgIGptcCAgICAgYmFkX3JlaW50CisKK2RyYW1fZG9uZTogCisJCisJLyogcmVhZGJhY2sgRFJDQkVOREFEUiBhbmQgcmV0dXJuIHRoZSBudW1iZXIKKwkgKiBvZiBhdmFpbGFibGUgcmFtIGJ5dGVzIGluICVlYXggKi8gCisKKyAgICAgICAgbW92bCAgICAkRFJDQkVOREFEUiwgJWVkaSAgICAgICAgLyogRFJBTSBlbmRpbmcgYWRkcmVzcyByZWdpc3RlciAgKi8KKwkKKwltb3ZsCSglZWRpKSwgJWVheAorCW1vdmwJJWVheCwgJWVjeAorCWFuZGwJJDB4ODAwMDAwMDAsICVlY3gKKwlqegliYW5rMgorCWFuZGwJJDB4N2YwMDAwMDAsICVlYXgKKwlzaHJsCSQyLCAlZWF4IAorCW1vdmwJJWVheCwgJWVieAorCitiYW5rMjogCW1vdmwJKCVlZGkpLCAlZWF4CisJbW92bAklZWF4LCAlZWN4CisJYW5kbAkkMHgwMDgwMDAwMCwgJWVjeAorCWp6CWJhbmsxCisJYW5kbAkkMHgwMDdmMDAwMCwgJWVheAorCXNobGwJJDYsICVlYXggCisJbW92bAklZWF4LCAlZWJ4CisKK2JhbmsxOiAJbW92bAkoJWVkaSksICVlYXgKKwltb3ZsCSVlYXgsICVlY3gKKwlhbmRsCSQweDAwMDA4MDAwLCAlZWN4CisJanoJYmFuazAKKwlhbmRsCSQweDAwMDA3ZjAwLCAlZWF4CisJc2hsbAkkMTQsICVlYXggCisJbW92bAklZWF4LCAlZWJ4CisKK2JhbmswOiAJbW92bAkoJWVkaSksICVlYXgKKwltb3ZsCSVlYXgsICVlY3gKKwlhbmRsCSQweDAwMDAwMDgwLCAlZWN4CisJanoJZG9uZQorCWFuZGwJJDB4MDAwMDAwN2YsICVlYXgKKwlzaGxsCSQyMiwgJWVheCAKKwltb3ZsCSVlYXgsICVlYngKKworZG9uZToJbW92bAklZWJ4LCAlZWF4CisKKwlqbXAJKiVlYnAKZGlmZiAtLWdpdCBhL2xpYl9pMzg2L3BjaV90eXBlMS5jIGIvbGliX2kzODYvcGNpX3R5cGUxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU1NzdlOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYl9pMzg2L3BjaV90eXBlMS5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBTdXBwb3J0IGZvciB0eXBlIFBDSSBjb25maWd1cmF0aW9uIGN5Y2xlcy4KKyAqIGJhc2VkIG9uIHBjaV9pbmRpcmVjdC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmZGVmIENPTkZJR19QQ0kKKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxwY2kuaD4KKworI2RlZmluZSBjZmdfcmVhZCh2YWwsIGFkZHIsIHR5cGUsIG9wKQkqdmFsID0gb3AoKHR5cGUpKGFkZHIpKQorI2RlZmluZSBjZmdfd3JpdGUodmFsLCBhZGRyLCB0eXBlLCBvcCkJb3AoKHZhbCksICh0eXBlICopKGFkZHIpKQorCisjZGVmaW5lIFRZUEUxX1BDSV9PUChydywgc2l6ZSwgdHlwZSwgb3AsIG1hc2spCQkJIFwKK3N0YXRpYyBpbnQJCQkJCQkJCSBcCit0eXBlMV8jI3J3IyNfY29uZmlnXyMjc2l6ZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIAkJIFwKKwkJCSAgICAgIHBjaV9kZXZfdCBkZXYsIGludCBvZmZzZXQsIHR5cGUgdmFsKQkgXAorewkJCQkJCQkJCSBcCisJb3V0bChkZXYgfCAob2Zmc2V0ICYgMHhmYykgfCAweDgwMDAwMDAwLCBob3NlLT5jZmdfYWRkcik7IAkgXAorCWNmZ18jI3J3KHZhbCwgaG9zZS0+Y2ZnX2RhdGEgKyAob2Zmc2V0ICYgbWFzayksIHR5cGUsIG9wKTsJIFwKKwlyZXR1cm4gMDsgICAgCQkJCQkgCQkgXAorfQorCisKK1RZUEUxX1BDSV9PUChyZWFkLCBieXRlLCB1OCAqLCBpbmIsIDMpCitUWVBFMV9QQ0lfT1AocmVhZCwgd29yZCwgdTE2ICosIGludywgMikKK1RZUEUxX1BDSV9PUChyZWFkLCBkd29yZCwgdTMyICosIGlubCwgMCkKKworVFlQRTFfUENJX09QKHdyaXRlLCBieXRlLCB1OCwgb3V0YiwgMykKK1RZUEUxX1BDSV9PUCh3cml0ZSwgd29yZCwgdTE2LCBvdXR3LCAyKQorVFlQRTFfUENJX09QKHdyaXRlLCBkd29yZCwgdTMyLCBvdXRsLCAwKQorCit2b2lkIHBjaV9zZXR1cF90eXBlMShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UsIHUzMiBjZmdfYWRkciwgdTMyIGNmZ19kYXRhKQoreworCXBjaV9zZXRfb3BzKGhvc2UsCisJCSAgICB0eXBlMV9yZWFkX2NvbmZpZ19ieXRlLAorCQkgICAgdHlwZTFfcmVhZF9jb25maWdfd29yZCwKKwkJICAgIHR5cGUxX3JlYWRfY29uZmlnX2R3b3JkLAorCQkgICAgdHlwZTFfd3JpdGVfY29uZmlnX2J5dGUsCisJCSAgICB0eXBlMV93cml0ZV9jb25maWdfd29yZCwKKwkJICAgIHR5cGUxX3dyaXRlX2NvbmZpZ19kd29yZCk7CisKKwlob3NlLT5jZmdfYWRkciA9ICh1bnNpZ25lZCBpbnQgKikgY2ZnX2FkZHI7CisJaG9zZS0+Y2ZnX2RhdGEgPSAodW5zaWduZWQgY2hhciAqKSBjZmdfZGF0YTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJfaTM4Ni9yZWFsbW9kZS5jIGIvbGliX2kzODYvcmVhbG1vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzIxNDdjCi0tLSAvZGV2L251bGwKKysrIGIvbGliX2kzODYvcmVhbG1vZGUuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBEYW5pZWwgRW5nc3Ry9m0sIE9taWNyb24gQ2V0aSBBQiwgZGFuaWVsQG9taWNyb24uc2UKKyAqIAorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKworCisjZGVmaW5lIFJFQUxNT0RFX0JBU0UgICAgKChjaGFyKikweDdjMCkKKyNkZWZpbmUgUkVBTE1PREVfTUFJTEJPWCAoKGNoYXIqKTB4ZTAwKQorCisKK2V4dGVybiBjaGFyIHJlYWxtb2RlX2VudGVyOworCisKK2ludCBlbnRlcl9yZWFsbW9kZSh1MTYgc2VnLCB1MTYgb2ZmLCBzdHJ1Y3QgcHRfcmVncyAqaW4sIHN0cnVjdCBwdF9yZWdzICpvdXQpCit7CisJCisJLyogc2V0dXAgb3V0IHRoaW4gYmlvcyBlbXVsYXRpb24gKi8KKwlpZiAoYmlvc19zZXR1cCgpKSB7CisJCXJldHVybiAtMTsKKwl9CisJCQorCS8qIGNvcHkgdGhlIHJlYWxtb2RlIHN3aXRjaCBjb2RlICovCisJaWYgKGkzODZib290X3JlYWxtb2RlX3NpemUgPiAoUkVBTE1PREVfTUFJTEJPWC1SRUFMTU9ERV9CQVNFKSkgeworCQlwcmludGYoInJlYWxtb2RlIHN3aXRjaCB0b28gbGFyZ2UgKCVsZCBieXRlcywgbWF4IGlzICVkKVxuIiwgCisJCSAgICAgICBpMzg2Ym9vdF9yZWFsbW9kZV9zaXplLCAoUkVBTE1PREVfTUFJTEJPWC1SRUFMTU9ERV9CQVNFKSk7CisJCXJldHVybiAtMTsKKwl9CisJCisJbWVtY3B5KFJFQUxNT0RFX0JBU0UsIGkzODZib290X3JlYWxtb2RlLCBpMzg2Ym9vdF9yZWFsbW9kZV9zaXplKTsKKwkJCisJCisJaW4tPmVpcCA9IG9mZjsKKwlpbi0+eGNzID0gc2VnOworCWlmICgzPmluLT5lc3AgJiAweGZmZmYpIHsKKwkJcHJpbnRmKCJXYXJuaW5nOiBlbnRlcmluZyByZWFsbW9kZSB3aXRoIHNwIDwgNCB3aWxsIGZhaWxcbiIpOworCX0KKwkKKwltZW1jcHkoUkVBTE1PREVfTUFJTEJPWCwgaW4sIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOworCQorCV9fYXNtX18gdm9sYXRpbGUgKCAKKwkJICJsY2FsbCAkMHgyMCwlMFxuIiAgOiA6ICAiaSIgKCZyZWFsbW9kZV9lbnRlcikgKTsKKworCW1lbWNweShvdXQsIFJFQUxNT0RFX01BSUxCT1gsIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOworCisJcmV0dXJuIG91dC0+ZWF4OworfQorCmRpZmYgLS1naXQgYS9saWJfaTM4Ni9yZWFsbW9kZV9zd2l0Y2guUyBiL2xpYl9pMzg2L3JlYWxtb2RlX3N3aXRjaC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMjEyYzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJfaTM4Ni9yZWFsbW9kZV9zd2l0Y2guUwpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogRGFuaWVsIEVuZ3N0cvZtLCBPbWljcm9uIENldGkgQUIsIGRhbmllbEBvbWljcm9uLnNlCisgKiAKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKworLyogMzJiaXQgLT4gMTZiaXQgLT4gMzJiaXQgbW9kZSBzd2l0Y2ggY29kZSAqLworCisvKgorICogU3RhY2sgZnJhbWUgYXQgMHhlMDAKKyAqICAgICAgZTAwIGVieDsKKyAqCWUwNCBlY3g7CisgKgllMDggZWR4OworICoJZTBjIGVzaTsKKyAqCWUxMCBlZGk7CisgKgllMTQgZWJwOyAKKyAqCWUxOCBlYXg7CisgKgllMWMgZHM7ICAKKyAqCWUyMCBlczsKKyAqCWUyNCBmczsgIAorICoJZTI4IGdzOworICoJZTJjIG9yaWdfZWF4OworICoJZTMwIGVpcDsKKyAqCWUzNCBjczsKKyAqCWUzOCBlZmxhZ3M7CisgKgllM2MgZXNwOworICoJZTQwIHNzOworICovCisKKyNkZWZpbmUgYTMyCQkuYnl0ZSAweDY3OwkJLyogYWRkcmVzcyBzaXplIHByZWZpeCAzMiAqLworI2RlZmluZSBvMzIJCS5ieXRlIDB4NjY7CQkvKiBvcGVyYW5kIHNpemUgcHJlZml4IDMyICovIAorCisuc2VjdGlvbiAucmVhbG1vZGUsICJheCIKKy5jb2RlMTYKKworCQkJCQkJLyogMTZiaXQgcHJvdGVjdGVkIG1vZGUgY29kZSBoZXJlICovCisuZ2xvYmwgcmVhbG1vZGVfZW50ZXIKK3JlYWxtb2RlX2VudGVyOgorbzMyCXB1c2hhCitvMzIJcHVzaGYKKwljbGkKKyAgICAgICAgc2lkdCAgIAlzYXZlZF9pZHQKKyAgICAgICAgc2dkdCAgICBzYXZlZF9nZHQKKyAgICAgICAgbW92bCAgICAlZXNwLCAlZWF4CisgICAgICAgIG1vdmwgICAgJWVheCwgc2F2ZWRfcHJvdGVjdGVkX21vZGVfZXNwCisJCisJbW92bAkkMHgxMCwgJWVheAorCW1vdmwgICAgJWVheCwgJWVzcAorCW1vdncJJDB4MjgsICVheAorCW1vdncJJWF4LCAlZHMKKwltb3Z3CSVheCwgJWVzCisJbW92dwklYXgsICVmcworCW1vdncJJWF4LCAlZ3MKKworCWxpZHQJcmVhbG1vZGVfaWR0X3B0cgorCW1vdmwJJWNyMCwgJWVheCAgICAgICAgICAgICAgICAJLyogR28gYmFjayBpbnRvIHJlYWwgbW9kZSBieSAqLworCWFuZGwJJDB4N2ZmZmZmZmUsICVlYXggICAgICAgICAJLyogY2xlYXJpbmcgUEUgdG8gMCAqLworCW1vdmwJJWVheCwgJWNyMAorCWxqbXAJJDB4MCwkZG9fcmVhbG1vZGUgICAgICAgICAgICAgCS8qIHN3aXRjaCB0byByZWFsIG1vZGUgKi8KKwkJCQkJCQorZG9fcmVhbG1vZGU6CQkJCQkvKiByZWFsbW9kZSBjb2RlIGZyb20gaGVyZSAqLyAKKwltb3Z3CSVjcywlYXgKKwltb3Z3CSVheCwlZHMKKwltb3Z3CSVheCwlZXMKKwltb3Z3CSVheCwlZnMKKwltb3Z3CSVheCwlZ3MKKwkKKwkJCQkJCS8qIGNyZWF0ZSBhIHRlbXBvcmFyeSBzdGFjayAqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwltb3Z3CSQweGMwLCAlYXggICAgICAgICAgICAgCisJbW92dwklYXgsICVzcyAgICAgICAgICAgICAgICAKKwltb3Z3CSQweDIwMCwgJWF4ICAgICAgICAgICAKKwltb3Z3CSVheCwgJXNwIAorCQorCXBvcGwJJWVieAorCXBvcGwJJWVjeAorCXBvcGwJJWVkeAorCXBvcGwJJWVzaQorCXBvcGwJJWVkaQorCXBvcGwJJWVicAorCXBvcGwJJWVheAorCW1vdmwJJWVheCwgdGVtcF9lYXgKKwlwb3BsCSVlYXgKKwltb3Z3CSVheCwgJWRzCisJcG9wbAklZWF4CisJbW92dwklYXgsICVlcworCXBvcGwJJWVheAorCW1vdncJJWF4LCAlZnMKKwlwb3BsCSVlYXgKKwltb3Z3CSVheCwgJWdzCisJcG9wbAklZWF4CQkJCS8qIG9yaWdfZWF4ICovCisJcG9wbAklZWF4Citjcwltb3Z3CSVheCwgdGVtcF9pcAorCXBvcGwJJWVheAorY3MJbW92dwklYXgsIHRlbXBfY3MKK28zMglwb3BmCisJcG9wbAklZWF4CisJcG9wdwklc3MKKwltb3ZsCSVlYXgsICVlc3AKK2NzCW1vdmwJdGVtcF9lYXgsICVlYXgKKwl3YmludmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VsZi1tb2RpZnlpbmcgY29kZSwKKwkJCQkJCSAqIGJldHRlciBmbHVzaCB0aGUgY2FjaGUgKi8KKwkKKwkuYnl0ZQkweDlhCQkJCS8qIGxjYWxsICovCit0ZW1wX2lwOgorCS53b3JkCTAJICAgICAJCQkvKiBuZXcgaXAgKi8KK3RlbXBfY3M6CQorCS53b3JkICAgMAkJCQkvKiBuZXcgY3MgKi8KK3JlYWxtb2RlX3JldDoKKwkJCQkJCS8qIHNhdmUgZWF4LCBlc3AgYW5kIHNzICovCitjcwltb3ZsCSVlYXgsIHNhdmVkX2VheAorCW1vdmwJJWVzcCwgJWVheAorY3MJbW92bAklZWF4LCBzYXZlZF9lc3AKKwltb3Z3ICAgICVzcywgJWF4Citjcwltb3Z3CSVheCwgc2F2ZWRfc3MKKwkKKwkvKiByZXN0b3JlIHRoZSBzdGFjaywgbm90ZSB0aGF0IHdlIHNldCBzcCB0byAweDI0NDsKKwkgKiBwdF9yZWdzIGlzIDB4NDQgYnl0ZXMgbG9uZyBhbmQgd2UgcHVzaCB0aGUgc3RydWN0dXJlCisJICogYmFja3dhcmRzIG9uIHRvIHRoZSBzdGFjaywgYm90dG9tIGZpcnN0ICovCisJIAorCW1vdncJJDB4YzAsICVheCAgICAgICAgICAgICAKKwltb3Z3CSVheCwgJXNzICAgICAgICAgICAgICAgIAorCW1vdncJJDB4MjQ0LCAlYXggICAgICAgICAgIAorCW1vdncJJWF4LCAlc3AgCisJCisJeG9ybAklZWF4LCVlYXgKK2NzCW1vdncJc2F2ZWRfc3MsICVheAorCXB1c2hsCSVlYXgKK2NzCW1vdmwJc2F2ZWRfZXNwLCAlZWF4CisJcHVzaGwJJWVheAorbzMyCXB1c2hmCisJeG9ybAklZWF4LCVlYXgKK2NzCW1vdncJdGVtcF9jcywgJWF4CisJcHVzaGwJJWVheAorY3MJbW92dwl0ZW1wX2lwLCAlYXgKKwlwdXNobAklZWF4CisJcHVzaGwJJDAKKwltb3Z3CSVncywgJWF4CisJcHVzaGwJJWVheAorCW1vdncJJWZzLCAlYXgKKwlwdXNobAklZWF4CisJbW92dwklZXMsICVheAorCXB1c2hsCSVlYXgKKwltb3Z3CSVkcywgJWF4CisJcHVzaGwJJWVheAorCW1vdmwJc2F2ZWRfZWF4LCAlZWF4CisJcHVzaGwJJWVheAorCXB1c2hsCSVlYnAKKwlwdXNobAklZWRpCisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZHgKKwlwdXNobAklZWN4CisJcHVzaGwJJWVieAorCitvMzIgY3MJbGlkdAlzYXZlZF9pZHQKK28zMiBjcwlsZ2R0ICAgIHNhdmVkX2dkdAkJCS8qIFNldCBHRFRSICovCisKKyAgICAgICAgbW92bCAgICAlY3IwLCAlZWF4ICAgICAgICAgICAgICAJLyogR28gYmFjayBpbnRvIHByb3RlY3RlZCBtb2RlICovCisgICAgICAgIG9ybCAgICAgJDEsJWVheCAgICAgICAgICAgICAgICAgCS8qIHJlc2V0IFBFIHRvIDEgKi8KKyAgICAgICAgbW92bCAgICAlZWF4LCAlY3IwICAgICAgICAgICAgICAgCisgICAgICAgIGptcCAgICAgbmV4dF9saW5lICAgICAgICAgICAgICAgCS8qIGZsdXNoIHByZWZldGNoIHF1ZXVlICovCituZXh0X2xpbmU6ICAgIAorICAgICAgICBtb3Z3CSRyZXR1cm5fcHRyLCAlYXggICAgICAgICAgCisgICAgICAgIG1vdncgICAgJWF4LCVicAorbzMyIGNzCWxqbXAJKiglYnApCisKKy5jb2RlMzIKK3Byb3RlY3RlZF9tb2RlOgorICAgICAgICBtb3ZsICAgICQweDE4LCVlYXggICAgICAgICAJCS8qIHJlbG9hZCBHRFRbM10gKi8KKyAgICAgICAgbW92dyAgICAlYXgsJWZzICAgICAgICAgICAgICAgICAJLyogcmVzZXQgRlMgKi8KKwltb3Z3CSVheCwlZHMgICAgICAgICAgICAgICAgCQkvKiByZXNldCBEUyAqLworICAgICAgICBtb3Z3ICAgICVheCwlZ3MgICAgICAgICAgICAgICAgIAkvKiByZXNldCBHUyAqLworICAgICAgICBtb3Z3ICAgICVheCwlZXMgICAgICAgICAgICAgICAgIAkvKiByZXNldCBFUyAqLworICAgICAgICBtb3Z3ICAgICVheCwlc3MgICAgICAgICAgICAgICAgIAkvKiByZXNldCBTUyAqLworICAgICAgICBtb3ZsICAgIHNhdmVkX3Byb3RlY3RlZF9tb2RlX2VzcCwgJWVheAorCW1vdmwJJWVheCwgJWVzcAorCXBvcGYKKwlwb3BhCisgICAgICAgIHJldAorCit0ZW1wX2VheDoKKwkubG9uZwkwCisKK3NhdmVkX3NzOgorCS53b3JkICAgMAorc2F2ZWRfZXNwOgorCS5sb25nCTAKK3NhdmVkX2VheDoKKwkubG9uZwkwCisJCityZWFsbW9kZV9pZHRfcHRyOgorCS53b3JkCTB4NDAwCQkJICAgICAgIAorCS53b3JkCTB4MCwgMHgwCQkKKwkKK3NhdmVkX2dkdDogIAorICAJLndvcmQgCTAsIDAsIDAsIDAKK3NhdmVkX2lkdDoKKyAgCS53b3JkIAkwLCAwLCAwLCAwCisKK3NhdmVkX3Byb3RlY3RlZF9tb2RlX2VzcDoKKwkubG9uZyAJMAorCQorcmV0dXJuX3B0cjoKKwkubG9uZwlwcm90ZWN0ZWRfbW9kZQorCS53b3JkCTB4MTAKZGlmZiAtLWdpdCBhL2xpYl9pMzg2L3ppbWFnZS5jIGIvbGliX2kzODYvemltYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkwZDQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYl9pMzg2L3ppbWFnZS5jCkBAIC0wLDAgKzEsMjc2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBEYW5pZWwgRW5nc3Ry9m0sIE9taWNyb24gQ2V0aSBBQiwgZGFuaWVsQG9taWNyb24uc2UKKyAqIAorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyogCisgKiBMaW51eCBpMzg2IHpJbWFnZSBhbmQgYnpJbWFnZSBsb2FkaW5nCisgKiAKKyAqIGJhc2VkIG9uIHRoZSBwcm9jZHVyZSBkZXNjcmliZWQgaW4gCisgKiBsaW51eC9Eb2N1bWVudGF0aW9uL2kzODYvYm9vdC50eHQKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS96aW1hZ2UuaD4KKyNpbmNsdWRlIDxhc20vcmVhbG1vZGUuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKy8qCisgKiBNZW1vcnkgbGF5LW91dDoKKyAqIAorICogcmVsYXRpdmUgdG8gc2V0dXBfYmFzZSAod2hpY2ggaXMgMHg5MDAwMCBjdXJyZW50bHkpCisgKiAKKyAqCTB4MDAwMC0weDdGRkYJUmVhbCBtb2RlIGtlcm5lbCAgIAorICoJMHg4MDAwLTB4OEZGRglTdGFjayBhbmQgaGVhcAorICoJMHg5MDAwLTB4OTBGRglLZXJuZWwgY29tbWFuZCBsaW5lCisgKi8KKyNkZWZpbmUgREVGQVVMVF9TRVRVUF9CQVNFICAweDkwMDAwCisjZGVmaW5lIENPTU1BTkRfTElORV9PRkZTRVQgMHg5MDAwCisjZGVmaW5lIEhFQVBfRU5EX09GRlNFVCAgICAgMHg4ZTAwCisKKyNkZWZpbmUgQ09NTUFORF9MSU5FX1NJWkUgICAyMDQ4CisKK3N0YXRpYyB2b2lkIGJ1aWxkX2NvbW1hbmRfbGluZShjaGFyICpjb21tYW5kX2xpbmUsIGludCBhdXRvX2Jvb3QpCit7CisJY2hhciAqZW52X2NvbW1hbmRfbGluZTsKKwkKKwljb21tYW5kX2xpbmVbMF0gPSAnXDAnOworCQorCWVudl9jb21tYW5kX2xpbmUgPSAgZ2V0ZW52KCJib290YXJncyIpOworCQorCS8qIHNldCBjb25zb2xlPSBhcmd1bWVudCBpZiB3ZSB1c2UgYSBzZXJpYWwgY29uc29sZSAqLworCWlmIChOVUxMID09IHN0cnN0cihlbnZfY29tbWFuZF9saW5lLCAiY29uc29sZT0iKSkgeworCQlpZiAoMD09c3RyY21wKGdldGVudigic3Rkb3V0IiksICJzZXJpYWwiKSkgeworCQkJCisJCQkvKiBXZSBzZWVtIHRvIHVzZSBzZXJpYWwgY29uc29sZSAqLworCQkJc3ByaW50Zihjb21tYW5kX2xpbmUsICJjb25zb2xlPXR0eVMwLCVzICIsIAorCQkJCSBnZXRlbnYoImJhdWRyYXRlIikpOworCQl9CisJfQorCQorCWlmIChhdXRvX2Jvb3QpIHsKKwkJc3RyY2F0KGNvbW1hbmRfbGluZSwgImF1dG8gIik7CisJfQorCQkKKwlpZiAoTlVMTCAhPSBlbnZfY29tbWFuZF9saW5lKSB7CisJCXN0cmNhdChjb21tYW5kX2xpbmUsIGVudl9jb21tYW5kX2xpbmUpOworCX0gCisJCisJCisJcHJpbnRmKCJLZXJuZWwgY29tbWFuZCBsaW5lOiBcIiVzXCJcbiIsIGNvbW1hbmRfbGluZSk7Cit9CisKK3ZvaWQgKmxvYWRfemltYWdlKGNoYXIgKmltYWdlLCB1bnNpZ25lZCBsb25nIGtlcm5lbF9zaXplLCAKKwkJICB1bnNpZ25lZCBsb25nIGluaXRyZF9hZGRyLCB1bnNpZ25lZCBsb25nIGluaXRyZF9zaXplLAorCQkgIGludCBhdXRvX2Jvb3QpCit7CisgICAgICAgIHZvaWQgKnNldHVwX2Jhc2U7CisJaW50IHNldHVwX3NpemU7CisJaW50IGJvb3Rwcm90bzsKKwlpbnQgYmlnX2ltYWdlOworCXZvaWQgKmxvYWRfYWRkcmVzczsKKwkKKwkKKwlzZXR1cF9iYXNlID0gKHZvaWQqKURFRkFVTFRfU0VUVVBfQkFTRTsJLyogYmFzZSBhZGRyZXNzIGZvciByZWFsLW1vZGUgc2VnbWVudCAqLworCQorIAlpZiAoS0VSTkVMX01BR0lDICE9ICoodTE2KikoaW1hZ2UgKyBCT09UX0ZMQUdfT0ZGKSkgeworCQlwcmludGYoIkVycm9yOiBJbnZhbGlkIGtlcm5lbCBtYWdpYyAoZm91bmQgMHglMDR4LCBleHBlY3RlZCAweGFhNTUpXG4iLAorCQkgICAgICAgKih1MTYqKShpbWFnZSArIEJPT1RfRkxBR19PRkYpKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCQorCS8qIGRldGVybWluZSBib290IHByb3RvY29sIHZlcnNpb24gKi8KKwlpZiAoS0VSTkVMX1YyX01BR0lDID09ICoodTMyKikoaW1hZ2UrSEVBREVSX09GRikpIHsKKwkJYm9vdHByb3RvID0gKih1MTYqKShpbWFnZStWRVJTSU9OX09GRik7CisJfSBlbHNlIHsKKwkJLyogVmVyeSBvbGQga2VybmVsICovCisJCWJvb3Rwcm90byA9IDB4MDEwMDsKKwl9CisJCisJLyogZGV0ZXJtaW5lIHNpemUgb2Ygc2V0dXAgKi8KKwlpZiAoMCA9PSAqKHU4KikoaW1hZ2UgKyBTRVRVUF9TRUNUU19PRkYpKSB7CisJCXNldHVwX3NpemUgPSA1ICogNTEyOworCX0gZWxzZSB7CisJCXNldHVwX3NpemUgPSAoKih1OCopKGltYWdlICsgU0VUVVBfU0VDVFNfT0ZGKSArIDEpICogNTEyOworCX0KKwkKKwlpZiAoc2V0dXBfc2l6ZSA+IFNFVFVQX01BWF9TSVpFKSB7CisJCXByaW50ZigiRXJyb3I6IFNldHVwIGlzIHRvbyBsYXJnZSAoJWQgYnl0ZXMpXG4iLCBzZXR1cF9zaXplKTsKKwl9CisJCisJLyogRGV0ZXJtaW5lIGltYWdlIHR5cGUgKi8KKyAgCWJpZ19pbWFnZSA9IChib290cHJvdG8gPj0gMHgwMjAwKSAmJiAoKih1OCopKGltYWdlICsgTE9BREZMQUdTX09GRikgJiBCSUdfS0VSTkVMX0ZMQUcpOworCQorCS8qIERlcmVybWluZSBsb2FkIGFkZHJlc3MgKi8KKwlsb2FkX2FkZHJlc3MgPSAodm9pZCopKGJpZ19pbWFnZSA/IEJaSU1BR0VfTE9BRF9BRERSOlpJTUFHRV9MT0FEX0FERFIpOworCQkJCisJLyogbG9hZCBzZXR1cCAqLworCW1lbW1vdmUoc2V0dXBfYmFzZSwgaW1hZ2UsIHNldHVwX3NpemUpOworCQorCXByaW50ZigiVXNpbmcgYm9vdCBwcm90b2NvbCB2ZXJzaW9uICV4LiUwMnhcbiIsIAorCSAgICAgICAoYm9vdHByb3RvICYgMHhmZjAwKSA+PiA4LCBib290cHJvdG8gJiAweGZmKTsKKwkKKwkKKwlpZiAoYm9vdHByb3RvID09IDB4MDEwMCkgewkJCisJCisJCSoodTE2Kikoc2V0dXBfYmFzZSArIENNRF9MSU5FX01BR0lDX09GRikgPSBDT01NQU5EX0xJTkVfTUFHSUM7CisJCSoodTE2Kikoc2V0dXBfYmFzZSArIENNRF9MSU5FX09GRlNFVF9PRkYpID0gQ09NTUFORF9MSU5FX09GRlNFVDsgCisJCQorCQkvKiBBIHZlcnkgb2xkIGtlcm5lbCBNVVNUIGhhdmUgaXRzIHJlYWwtbW9kZSBjb2RlCisJCSAqIGxvYWRlZCBhdCAweDkwMDAwICovCisJCQorCQlpZiAoKHUzMilzZXR1cF9iYXNlICE9IDB4OTAwMDApIHsKKwkJCS8qIENvcHkgdGhlIHJlYWwtbW9kZSBrZXJuZWwgKi8KKwkJCW1lbW1vdmUoKHZvaWQqKTB4OTAwMDAsIHNldHVwX2Jhc2UsIHNldHVwX3NpemUpOworCQkJLyogQ29weSB0aGUgY29tbWFuZCBsaW5lICovCisJCQltZW1tb3ZlKCh2b2lkKikweDk5MDAwLCBzZXR1cF9iYXNlK0NPTU1BTkRfTElORV9PRkZTRVQsIAorCQkJICAgICAgIENPTU1BTkRfTElORV9TSVpFKTsKKwkJCQorCQkJc2V0dXBfYmFzZSA9ICh2b2lkKikweDkwMDAwOwkJIC8qIFJlbG9jYXRlZCAqLworCQl9CisJCQorCQkvKiBJdCBpcyByZWNvbW1lbmRlZCB0byBjbGVhciBtZW1vcnkgdXAgdG8gdGhlIDMySyBtYXJrICovCisJCW1lbXNldCgodm9pZCopMHg5MDAwMCArIHNldHVwX3NpemUsIDAsIFNFVFVQX01BWF9TSVpFLXNldHVwX3NpemUpOworCX0KKwkKKwlpZiAoYm9vdHByb3RvID49IDB4MDIwMCkgeworCQkqKHU4Kikoc2V0dXBfYmFzZSArIFRZUEVfT0ZfTE9BREVSX09GRikgPSAweGZmOworCQlwcmludGYoIkxpbnV4IGtlcm5lbCB2ZXJzaW9uICVzXG4iLCAKKwkJICAgICAgIChjaGFyKikoc2V0dXBfYmFzZSArIFNFVFVQX1NUQVJUX09GRlNFVCArIAorCQkJICAgICAgICoodTE2Kikoc2V0dXBfYmFzZSArIFNUQVJUX1NZU19PRkYgKyAyKSkpOworCQkKKwkJaWYgKGluaXRyZF9hZGRyKSB7CisJCQlwcmludGYoIkluaXRpYWwgUkFNIGRpc2sgYXQgbGluZWFyIGFkZHJlc3MgMHglMDhseCwgc2l6ZSAlbGQgYnl0ZXNcbiIsCisJCQkgICAgICAgaW5pdHJkX2FkZHIsIGluaXRyZF9zaXplKTsKKwkJCQorCQkJKih1MzIqKShzZXR1cF9iYXNlICsgUkFNRElTS19JTUFHRV9PRkYpID0gaW5pdHJkX2FkZHI7CisJCQkqKHUzMiopKHNldHVwX2Jhc2UgKyBSQU1ESVNLX1NJWkVfT0ZGKT1pbml0cmRfc2l6ZTsKKwkJfQorCX0KKwkKKwlpZiAoYm9vdHByb3RvID49IDB4MDIwMSkgeworCQkqKHUxNiopKHNldHVwX2Jhc2UgKyBIRUFQX0VORF9QVFJfT0ZGKSA9IEhFQVBfRU5EX09GRlNFVDsKKwkJCisJCS8qIENBTl9VU0VfSEVBUCAqLworCQkqKHU4Kikoc2V0dXBfYmFzZSArIExPQURGTEFHU19PRkYpID0gCisJCQkqKHU4Kikoc2V0dXBfYmFzZSArIExPQURGTEFHU19PRkYpIHwgSEVBUF9GTEFHOworCX0KKwkKKwlpZiAoYm9vdHByb3RvID49IDB4MDIwMikgeworCQkqKHUzMiopKHNldHVwX2Jhc2UgKyBDTURfTElORV9QVFJfT0ZGKSA9ICh1MzIpc2V0dXBfYmFzZSArIENPTU1BTkRfTElORV9PRkZTRVQ7CisJfSBlbHNlIGlmIChib290cHJvdG8gPj0gMHgwMjAwKSB7CisJCSoodTE2Kikoc2V0dXBfYmFzZSArIENNRF9MSU5FX01BR0lDX09GRikgPSBDT01NQU5EX0xJTkVfTUFHSUM7CisJCSoodTE2Kikoc2V0dXBfYmFzZSArIENNRF9MSU5FX09GRlNFVF9PRkYpID0gQ09NTUFORF9MSU5FX09GRlNFVDsgCisJCSoodTE2Kikoc2V0dXBfYmFzZSArIFNFVFVQX01PVkVfU0laRV9PRkYpID0gMHg5MTAwOworCX0KKwkKKworCQorCWlmIChiaWdfaW1hZ2UpIHsKKwkJaWYgKChrZXJuZWxfc2l6ZSAtIHNldHVwX3NpemUpID4gQlpJTUFHRV9NQVhfU0laRSkgeyAKKwkJCXByaW50ZigiRXJyb3I6IGJ6SW1hZ2Uga2VybmVsIHRvbyBiaWchIChzaXplOiAlbGQsIG1heDogJWQpXG4iLAorCQkJICAgICAgIGtlcm5lbF9zaXplIC0gc2V0dXBfc2l6ZSwgQlpJTUFHRV9NQVhfU0laRSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkKKwl9IGVsc2UgaWYgKChrZXJuZWxfc2l6ZSAtIHNldHVwX3NpemUpID4gWklNQUdFX01BWF9TSVpFKSB7CisJCXByaW50ZigiRXJyb3I6IHpJbWFnZSBrZXJuZWwgdG9vIGJpZyEgKHNpemU6ICVsZCwgbWF4OiAlZClcbiIsCisJCSAgICAgICBrZXJuZWxfc2l6ZSAtIHNldHVwX3NpemUsIFpJTUFHRV9NQVhfU0laRSk7CisJCXJldHVybiAwOworCX0KKwkKKwkvKiBidWlsZCBjb21tYW5kIGxpbmUgYXQgQ09NTUFORF9MSU5FX09GRlNFVCAqLworCWJ1aWxkX2NvbW1hbmRfbGluZShzZXR1cF9iYXNlICsgQ09NTUFORF9MSU5FX09GRlNFVCwgYXV0b19ib290KTsKKwkKKyAgICAgICAgcHJpbnRmKCJMb2FkaW5nICVjekltYWdlIGF0IGFkZHJlc3MgMHglMDh4ICglbGQgYnl0ZXMpXG4iLCBiaWdfaW1hZ2UgPyAnYicgOiAnICcsIAorCSAgICAgICAodTMyKWxvYWRfYWRkcmVzcywga2VybmVsX3NpemUgLSBzZXR1cF9zaXplKTsKKworCSAgICAgICAKKwltZW1tb3ZlKGxvYWRfYWRkcmVzcywgaW1hZ2UgKyBzZXR1cF9zaXplLCBrZXJuZWxfc2l6ZSAtIHNldHVwX3NpemUpOworCQorCS8qIHJlYWR5IGZvciBib290aW5nICovCisJcmV0dXJuIHNldHVwX2Jhc2U7Cit9CisKKwordm9pZCBib290X3ppbWFnZSh2b2lkICpzZXR1cF9iYXNlKQoreworCXN0cnVjdCBwdF9yZWdzIHJlZ3M7CisJCisJbWVtc2V0KCZyZWdzLCAwLCBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKTsKKwlyZWdzLnhkcyA9ICh1MzIpc2V0dXBfYmFzZSA+PiA0OworCXJlZ3MueHNzID0gMHg4ZTAwOworCXJlZ3MuZXNwID0gMHgyMDA7CisJcmVncy5lZmxhZ3MgPSAwOworCWVudGVyX3JlYWxtb2RlKCgodTMyKXNldHVwX2Jhc2UrU0VUVVBfU1RBUlRfT0ZGU0VUKT4+NCwgMCwgJnJlZ3MsICZyZWdzKTsKK30KKworCitpbWFnZV9oZWFkZXJfdCAqZmFrZV96aW1hZ2VfaGVhZGVyKGltYWdlX2hlYWRlcl90ICpoZHIsIHZvaWQgKnB0ciwgaW50IHNpemUpCit7CQorCS8qIFRoZXJlIGlzIG5vIHdheSB0byBrbm93IHRoZSBzaXplIG9mIGEgekltYWdlIC4uLiAqCisJICogc28gd2UgYXNzdW1lIHRoYXQgMk1CIHdpbGwgYmUgZW5vdWdoIGZvciBub3cgKi8KKyNkZWZpbmUgWklNQUdFX1NJWkUgMHgyMDAwMDAKKwkKKwkvKiBsb2FkIGEgMU1CLCB0aGUgbG9hZGVkIHdpbGwgaGF2ZSB0byBiZSBtb3ZlZCB0byBpdHMgZmluYWwKKwkgKiBwb3NpdGlvbiBhZ2FpbiBsYXRlci4uLiAqLworI2RlZmluZSBaSU1BR0VfTE9BRCAweDEwMDAwMAorCQorCXVsb25nIGNoZWNrc3VtOworCQorIAlpZiAoS0VSTkVMX01BR0lDICE9ICoodTE2KikocHRyICsgQk9PVF9GTEFHX09GRikpIHsKKwkJLyogbm90IGEgekltYWdlIG9yIGJ6SW1hZ2UgKi8KKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKC0xID09IHNpemUpIHsKKwkJc2l6ZSA9IFpJTUFHRV9TSVpFOworCX0KKyNpZiAwCQorCWNoZWNrc3VtID0gY3JjMzIgKDAsIHB0ciwgc2l6ZSk7CisjZWxzZQorCWNoZWNrc3VtID0gMDsKKyNlbmRpZgkJCisJbWVtc2V0KGhkciwgMCwgc2l6ZW9mKGltYWdlX2hlYWRlcl90KSk7CisJCisJLyogQnVpbGQgbmV3IGhlYWRlciAqLworCWhkci0+aWhfbWFnaWMgPSBodG9ubChJSF9NQUdJQyk7CisJaGRyLT5paF90aW1lICA9IDA7CisJaGRyLT5paF9zaXplICA9IGh0b25sKHNpemUpOworCWhkci0+aWhfbG9hZCAgPSBodG9ubChaSU1BR0VfTE9BRCk7CisJaGRyLT5paF9lcCAgICA9IDA7CisJaGRyLT5paF9kY3JjICA9IGh0b25sKGNoZWNrc3VtKTsKKwloZHItPmloX29zICAgID0gSUhfT1NfTElOVVg7CisJaGRyLT5paF9hcmNoICA9IElIX0NQVV9JMzg2OworCWhkci0+aWhfdHlwZSAgPSBJSF9UWVBFX0tFUk5FTDsKKwloZHItPmloX2NvbXAgID0gSUhfQ09NUF9OT05FOworCisJc3RybmNweSgoY2hhciAqKWhkci0+aWhfbmFtZSwgIihub25lKSIsIElIX05NTEVOKTsKKworCWNoZWNrc3VtID0gY3JjMzIoMCwoY29uc3QgY2hhciAqKWhkcixzaXplb2YoaW1hZ2VfaGVhZGVyX3QpKTsKKworCWhkci0+aWhfaGNyYyA9IGh0b25sKGNoZWNrc3VtKTsKKwkKKwlyZXR1cm4gaGRyOworfQo=